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