
消费失败的消息去哪?多数团队的答案是一个从没人看过的死信队列(DLQ)——消息堆积、无人处理、直到磁盘爆了才发现。死信队列的正确设计:每条死信都有明确的分类、告警路径与补偿预案。它不是「失败消息的堆放地」,是消费链路的最后一道质量防线。
先分类再处理——不同原因的死信,处置完全不同:
设计要点:死信消息必须携带元数据(原始 topic、分区、offset、失败原因、异常堆栈、重试次数、首次失败时间)——没有这些,死信就是黑盒。
```
消息消费失败 → 本地重试 3 次(立即,间隔 0s/1s/2s)
→ 仍然失败 → 进重试 topic(延迟递增:10s/30s/1min/5min/30min)
→ 超过最大重试次数 → 进死信 topic
```
关键设计:重放操作必须幂等且可审计——谁在什么时间重放了哪些消息、处理结果是什么,写进操作日志。
```
消费者 → 本地重试(3) → 重试 topic(分层延迟, 最多 10 次) → 死信 topic
↓
监控告警(分类 + 堆积)
↓
诊断工具(查看元数据 + 异常)
↓
补偿工具(重放 / 修复后重放 / 人工)
```
工具链配套:没有诊断工具的死信队列等于没有——至少提供一个 Web 界面能查看死信列表、按原因过滤、预览消息内容、一键重放。自建可用 Kafka UI / RocketMQ Console 改造;云上用消息队列自带控制台。
死信队列的成熟标志:任何一条消息丢失都能追溯到它进了死信、被谁处理、处理结果如何。做到这个,消息系统的「至少一次送达」才真正闭环。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。