← 中文资源

简体中文版本

排查 Webhook 重复投递

结合投递 id 与时间戳,区分提供方的重试与你自身管线重复发出的重复事件。

阅读英文原文

目标

订单被创建两次,但无法判断是提供方重试还是消费端重复处理。本配方先按提供方投递 id 去重,再用时间戳分析重复投递是否落在提供方重试窗口内,从而定位重复的真正来源并修复。

步骤要点

  1. 在任何业务逻辑之前,按提供方投递 id 去重。
  2. 用 SQL 按投递 id 分组,查看重复次数与时间窗口。
  3. 若旧载荷缺少投递 id,退化用「事件类型加正文哈希」作为去重键。
  4. 把去重检查放在摄取边界,确保副作用不会执行两次。
const seen = new Set();
for (const event of events) {
  if (seen.has(event.deliveryId)) continue;
  seen.add(event.deliveryId);
  await process(event);
}

排错提示

  • 缺少投递 id 的旧载荷需要回退去重键。
  • 去重若放在业务逻辑之后则无效。
  • 去重存储必须持久且跨消费端共享。

适用边界

  • 依赖提供方提供稳定的投递 id。
  • 无法处理提供方确实发出内容不同的重复事件。