← 中文资源

简体中文版本

事务收件箱

事务收件箱把“收到消息”与“处理消息”存进同一个数据库事务,消费者即便遇到重投也只处理一次。

阅读英文原文

概念定义

broker 会重投:崩溃、超时、再平衡。任何执行非幂等工作的消费者终将把一条消息执行两次。收件箱原子地记录“已经做过什么”,与做这件事本身同生共死。

工作机制

收到后,处理器在事务里向收件箱表插入消息 id 并执行业务写入;重投撞上 id 唯一冲突即跳过。清理策略按年龄归档或分区,热表保持小巧。

使用场景

向数据库写非幂等效果的消费者:重复扣款、重复记录、重复通知。与事务发件箱组合,无需分布式事务即可获得端到端的有效一次。

常见误区

收件箱是消费者数据库里的一张表,不是独立服务。去重键的选择决定成败:broker 偏移量在重放与再平衡后会变,业务或生产方消息 id 才能幸存。收件箱写入必须与业务写同事务——分开提交就会丢消息或双处理;它也只保护本地事务,API 调用、邮件等非数据库副作用仍需目标侧的幂等键。收件箱无限增长会拖慢每个事务——要按年龄归档。