首页/开发/系统分析与架构设计速查/收件箱模式(Idempotent Consumer)

收件箱模式(Idempotent Consumer)

消费端记录已处理的消息标识(inbox 表),与业务变更同事务提交;重复投递时跳过处理,保证“至少一次投递”下的消费效果不重复。

记录时机与业务写入同一事务,保证原子
判断消息 ID 已存在则跳过,但需更新消费位点
配套失败重试与死信队列
  • 建表:inbox(message_id 去重约束, consumer, processed_at)
  • 同事务:业务变更与 inbox 插入在同一事务提交
  • 判定:去重约束冲突即已处理,跳过业务并提交消费位点
  • 清理:已处理记录按时间归档,控制表体积与查询开销
  • 异常:业务失败不写 inbox,交由重试与死信流程处理
  • 位点提交:所有处理分支都要提交位点,避免重复投递循环
跨库场景先写本地 inbox,再以本地事务驱动业务写入,或改用本地消息表方案
并发注意同一消息并发到达时依赖数据库约束兜底,而非先查后写的应用逻辑
inbox 与 outbox 常成对出现,构成可靠消息链路的两端。

易错点

  • 先处理业务后写 inbox,中间崩溃仍会重复处理
  • 跳过重复消息时忘记提交消费位点,消息被反复投递

数据来源与参考

  • microservices.io 模式目录
  • 《Enterprise Integration Patterns》:Idempotent Receiver
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌