企业软件集成中,Webhook 和 API 几乎无处不在。支付平台通知订单结果,电商系统同步库存,CRM接收客户状态变化,云平台发送部署结果,物流系统推送运输状态,这些场景背后都可能同时使用 API 和 Webhook。很多开发人员习惯把两者简单理解成“Webhook主动推送,API主动查询”,这个理解可以帮助入门,但对于真正的企业级系统设计还不够。两者最核心的区别并不是 HTTP 方法不同,而是通信模型不同:API通常由调用方主动发起请求,Webhook则由提供事件的一方在事件发生后主动通知订阅方。一个负责“我要数据”,另一个更接近“事情发生了,我通知你”。
API的基本模型是请求与响应。调用方知道某个资源或者操作的接口地址,然后主动发起 HTTP 请求,例如查询订单、获取用户资料、读取库存、创建付款、提交文件或者启动一个任务。服务端接收到请求之后返回结果。GET、POST、PUT、PATCH和DELETE只是常见的HTTP方法,API本身并不局限于REST,也不一定只能采用同步模式。GraphQL、gRPC以及异步任务API同样属于API通信范畴。因此,把API定义成“同步通信”并不严谨。更准确的说法是,API通常给予调用方主动控制请求时机和请求参数的能力。
Webhook则采用事件驱动模型。第三方系统预先登记一个回调地址,当特定事件发生后,服务端向这个地址发出HTTP请求,通常是POST,并携带事件类型、对象ID、时间戳以及相关业务数据。例如支付系统发现一笔订单已经完成,就可以向商户系统发送 payment.succeeded 事件。商户系统收到通知后,根据事件内容更新本地订单状态。这样就不需要商户服务器每隔几秒向支付平台询问“订单成功了吗”。
两种模型最直观的区别,可以用订单支付来理解。如果只使用API,商户系统可能需要不断轮询支付平台:订单有没有付款?还是没有?再问一次,还是没有?这种方式简单,但随着订单数量和轮询频率增加,会产生大量没有业务价值的请求。如果采用Webhook,支付平台在订单状态真正发生变化后才发送通知,商户系统只在有事件的时候处理数据。对于大量事件驱动业务,这种模式可以明显减少无效轮询。
但Webhook并不是一种“绝对实时”的通信机制。事件发生以后,还需要经过事件产生、排队、网络传输、接收服务器处理等过程,因此它仍然可能出现延迟。网络故障、目标服务器宕机、DNS异常、TLS错误、负载过高或者第三方服务重试策略,都可能导致通知晚到。企业系统因此不能把“收到Webhook”简单等同于“数据库状态已经永久正确”。
这也是企业级Webhook设计最重要的地方:Webhook通常应该被看成事件通知,而不是唯一的数据真相来源。比较稳健的架构是收到Webhook之后,先验证事件,再根据事件ID实现幂等处理;如果事件内容不足以完成业务操作,可以通过API主动查询最新资源状态。这样Webhook负责告诉系统“可能发生了变化”,API负责进一步确认“现在到底是什么状态”。
Webhook的可靠性设计尤其重要。第三方服务可能因为网络超时而认为第一次投递失败,然后再次发送同一个事件。如果接收方没有幂等设计,就可能出现订单重复入账、库存重复扣减、会员积分重复增加等严重问题。因此,企业系统通常应该保存事件ID或者业务唯一键,在数据库层面建立唯一约束,并确保重复事件不会重复执行核心业务操作。
Webhook的重试机制也必须设计清楚。一个成熟的Webhook提供方通常会在接收方返回失败状态或者连接超时后进行重试,但具体重试次数、间隔和最大持续时间取决于服务提供商。接收方则应该尽快返回成功响应,不要在Webhook HTTP请求中执行大量耗时业务。比较常见的架构是接收到请求后完成签名验证和基本格式检查,把事件写入消息队列或者可靠任务系统,然后快速返回HTTP 2xx,再由后台Worker异步处理。
这样设计还有一个好处:第三方服务的重试不会因为你的业务处理速度慢而不断触发。假设一次订单处理需要几秒钟,而Webhook提供方等待两秒就认为请求超时,那么你的服务器即使最终成功处理,也可能已经产生多个重复事件。把“接收通知”和“执行业务”分开,可以明显降低这种问题。
安全方面,Webhook与API的风险模型也不完全相同。API通常由调用方主动访问,因此服务端可以在入口处实施OAuth 2.0、API Key、JWT、mTLS等认证机制,同时通过IAM、权限范围、速率限制和网关策略控制访问。Webhook则恰好相反,因为外部服务会主动向你的服务器发请求,所以你的系统必须确认“这个请求到底是谁发来的,以及它是不是原来的那条消息”。
因此,Webhook不能只依赖IP白名单。IP地址可能变化,而且在复杂云环境中,仅靠来源IP并不能证明请求内容没有被篡改。更可靠的方式通常是使用HMAC签名、非对称签名或者供应商提供的签名验证机制,同时检查时间戳和事件ID,防止攻击者截获一条合法请求后无限重复发送。对于高安全要求的系统,还可以使用mTLS等机制进一步确认通信双方身份。
重放攻击是Webhook设计中一个容易被忽略的问题。假设攻击者截获了一次合法的“付款成功”通知,即使无法修改里面的内容,也可能尝试把这条合法消息重新发送几十次。如果系统只验证签名而没有检查时间戳和事件唯一ID,那么这条消息仍然可能被重复执行。因此,签名验证、时间窗口检查和幂等处理应该一起设计,而不是把“有签名”当成完整的Webhook安全方案。
API同样存在自己的问题。最常见的问题是轮询。当业务系统不断调用接口查询没有变化的数据时,会浪费双方的CPU、网络和数据库资源。为了缓解这个问题,可以使用条件请求、缓存、ETag、Last-Modified、增量同步、分页、批量接口等机制。如果数据必须高度实时,又没有Webhook或事件流支持,就需要根据业务价值设计合理的轮询周期,而不是简单地设置成每秒一次。
数据一致性也是两种模型经常被误解的地方。API请求返回成功,并不意味着整个分布式业务已经完成一致性提交;Webhook收到事件,也不意味着本地数据库已经完成最终处理。企业系统应该明确区分强一致、最终一致以及业务状态机。比如订单支付这种业务,可以规定订单状态只能按照合法状态转换推进,并通过事件ID、版本号或者时间戳防止旧事件覆盖新状态。
对于库存系统,API和Webhook甚至应该同时存在。商品库存发生变化时,库存系统可以通过Webhook或者消息系统通知下游服务;下游系统如果需要精确库存数字,则通过API主动读取当前库存。这样可以避免把Webhook payload当成永久可靠的数据库快照。事件通知告诉你“库存发生变化”,API则可以在需要时提供“当前库存是多少”。
企业系统如果规模进一步扩大,还可以在Webhook和API之外引入消息队列或者事件总线。Webhook适合跨组织、跨供应商进行事件通知,消息队列适合企业内部进行可靠异步处理,API则适合资源查询和命令调用。三者承担的职责不同,并不应该为了追求某一种技术而强行统一。
例如一个电商订单系统可以采用这样的结构:用户创建订单时,通过API调用订单服务;支付平台完成付款后,通过Webhook通知订单系统;订单系统验证Webhook签名并将事件写入消息队列;后台消费者更新订单状态;如果通知内容不足以判断最终支付状态,则通过支付平台API主动查询;如果Webhook长期没有到达,还可以由定时任务通过API执行补偿查询。这样即使Webhook暂时失败,系统仍然拥有恢复数据状态的路径。
从运维角度看,Webhook需要监控投递成功率、HTTP响应码、处理延迟、重试次数、死信事件和重复事件数量。API则需要监控请求量、错误率、P50/P95/P99延迟、429限流响应、5xx错误、超时以及下游依赖状态。如果企业只监控API调用,而没有监控Webhook事件生命周期,那么出现“第三方已经发送,但我们没有正确处理”的问题时,排查会非常困难。
日志和分布式追踪同样重要。一个企业级集成请求可能经过API Gateway、Webhook入口、消息队列、Worker、数据库以及第三方API多个系统。应该使用统一的request ID、event ID或者trace ID把整个链路串起来。这样出现一次订单状态异常时,可以追踪它到底是第三方没有发送、Webhook没有收到、签名验证失败、消息没有进入队列,还是后台消费者处理失败。
选择API还是Webhook,也不应该简单按照“实时就Webhook,查询就API”一刀切。更准确的判断方式是看业务到底需要什么。如果调用方必须决定什么时候获取数据,API通常更加合适;如果数据变化发生的时间由另一套系统决定,而且下游希望尽快得到通知,Webhook更加合适。如果业务既需要及时通知,又需要准确读取当前状态,那么Webhook加API通常是更合理的组合。
还有一个经常被忽略的现实问题:Webhook要求接收方提供一个稳定、可访问的HTTP endpoint。对于部署在严格内网、没有公网入口或者网络边界非常复杂的企业环境,直接接收第三方Webhook可能需要API Gateway、反向代理、私有连接或者专门的消息接入层。API虽然也需要网络连通和身份认证,但调用方向通常更容易由企业自己的网络策略控制。
因此,在正式上线之前,企业应该测试的不只是“接口能不能通”,还包括第三方服务重复发送事件怎么办、Webhook延迟几个小时怎么办、消息顺序颠倒怎么办、签名验证失败怎么办、接收服务器宕机怎么办、数据库事务失败怎么办、API限流怎么办,以及第三方服务完全不可用时如何恢复。只有这些异常路径都有明确处理方式,软件集成才算真正进入生产级水平。
Webhook和API最终不是竞争关系。API解决的是调用方主动获取资源或者执行操作的问题,Webhook解决的是事件发生以后主动通知其他系统的问题。企业成熟的集成架构往往同时使用两者,再配合消息队列、幂等机制、重试、死信处理、补偿查询、身份认证和分布式追踪,把一次简单的HTTP通信变成一套能够承受网络故障和业务异常的可靠系统。
从工程实践来看,最稳妥的设计通常不是让Webhook承担所有事情,也不是让API不断轮询一切数据,而是让每种机制承担自己最擅长的任务:事件发生时用Webhook通知,需要精确数据时用API查询,无法实时处理时交给消息队列,处理失败时通过重试和补偿机制恢复状态。这样设计出来的系统,才不会因为某一次网络抖动、第三方服务故障或者重复消息而让整个业务链条失去控制。
Webhook 和 API 有什么不同,企业软件集成时应该如何选择
图片说明:示意图 图片来源:Public Domain(公有领域)
喜欢这篇报道?
使用下面的功能,方便以后继续阅读和分享 MNewsTV
关于文章收藏
收藏不需要注册帐号,收藏信息仅保存在当前浏览器中。
删除收藏请进入「我的收藏」进行管理。
捐助(Paypal): https://www.paypal.me/observeccp 订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP