目标
订单被创建两次,但无法判断是提供方重试还是消费端重复处理。本配方先按提供方投递 id 去重,再用时间戳分析重复投递是否落在提供方重试窗口内,从而定位重复的真正来源并修复。
步骤要点
- 在任何业务逻辑之前,按提供方投递 id 去重。
- 用 SQL 按投递 id 分组,查看重复次数与时间窗口。
- 若旧载荷缺少投递 id,退化用「事件类型加正文哈希」作为去重键。
- 把去重检查放在摄取边界,确保副作用不会执行两次。
const seen = new Set();
for (const event of events) {
if (seen.has(event.deliveryId)) continue;
seen.add(event.deliveryId);
await process(event);
}
排错提示
- 缺少投递 id 的旧载荷需要回退去重键。
- 去重若放在业务逻辑之后则无效。
- 去重存储必须持久且跨消费端共享。
适用边界
- 依赖提供方提供稳定的投递 id。
- 无法处理提供方确实发出内容不同的重复事件。