🧠 图解记忆:先澄清事件是否有稳定 ID、是否允许乱序、更新语义、吞吐、保留期和下游一致性要求;点击图片可查看原图。
💡 答案要点
先澄清事件是否有稳定 ID、是否允许乱序、更新语义、吞吐、保留期和下游一致性要求。
核心设计:
- 接口快速校验并写入持久队列,返回接收状态;
- 使用
(source, event_id)作为幂等键,数据库唯一约束是最后防线; - 消费者采用条件 upsert,按 event_version 或 event_time 处理乱序;
- 业务写入与 outbox 放在同一事务,避免状态已变但下游事件丢失;
- 暂时错误有限重试,永久错误进入 DLQ 并保留原因;
- 提供 checkpoint、重放、对账以及重复/迟到/失败指标。
编码时应把“至少一次投递”与“业务效果只发生一次”区分开。对于付款等副作用,还需要下游同样接受幂等键,不能只在入口去重。
