标准答案

  1. 发送方使用超时、指数退避和最大次数,签名应覆盖原始请求体、时间戳和密钥版本。
  2. 接收方先验签和校验时间窗口,再按事件 ID 持久化去重记录,随后快速返回 2xx 并投递内部队列。
  3. 事件处理器要支持重复、乱序、失败重试和状态查询;不能因返回成功就假设业务处理已经完成。
  4. 双方应约定事件版本、重放方式、签名轮换和最终对账接口。

题目解析

Webhook 发送方通常会在超时或非 2xx 时重试,因此接收方必须把它当作至少一次通知。签名验证只回答请求是否来自可信发送方,不回答业务事件是否已经处理。

接收方应尽快验签、校验时间窗口和事件结构,持久化事件 ID 或幂等记录后返回确认,再由内部队列异步处理。队列削峰不等于业务结果已经完成。

事件处理要支持重复、乱序、版本和失败回查,双方还应约定重放、签名轮换和对账接口。只依赖 IP 或内存去重无法覆盖代理、重启和多实例。

常见误区

  • 误区:只按 IP 白名单信任请求。改正:校验签名、时间戳、密钥版本和事件 ID,IP 只能作为辅助限制。
  • 误区:同步完成全部业务后才响应。改正:先验签并持久化受理证据,再异步处理;处理结果通过状态或对账查询。
  • 误区:只在内存里去重事件 ID。改正:使用持久化唯一约束或幂等记录,覆盖重启、多实例和重放。

作者信息