什么是毒消息治理
毒消息指反复处理失败并阻塞队列的消息。治理要点是先分类再处置:因网络抖动、下游短暂不可用导致的失败属可重试,按退避策略重试;因格式错误、校验失败导致的失败属不可重试,应立即隔离避免无效重试。超过重试上限的消息转入死信通道并触发告警,同时保留原始内容与失败原因用于补数与排查。
基本信息
| 两类失败 | 可重试(依赖临时故障)与不可重试(消息本身有问题) |
|---|---|
| 重试策略 | 指数退避加重试上限,避免同步重试放大压力 |
| 隔离机制 | 超限转死信通道,保留原消息、失败原因与追踪标识 |
| 告警要求 | 死信数量与增速要进监控,避免坏消息静默堆积 |
典型使用场景
- 消息消费链路:消费者遇到处理异常时按错误类型选择重试或隔离
- 批量导入:单条记录格式错误时跳过并记录,不能阻塞整批
- 跨系统对接:对方字段变更导致解析失败,需要立即隔离并通知对接方
- 高峰保护:下游限流时退避重试,避免同步重试把下游压垮
- 补数场景:死信修复后按原始内容重投,验证幂等与顺序要求
- 灰度变更:新版本消费者上线后出现大量死信,及时回退版本
处理策略与死信记录
处理策略与死信记录
# 分类处置
可重试错误(超时、连接失败、下游 5xx)
-> 指数退避重试:1s / 5s / 25s,累计 5 次后转死信
不可重试错误(反序列化失败、字段校验失败、业务规则拒绝)
-> 立即转死信,避免无效重试占用消费位
未知错误
-> 保守限次重试后隔离,人工确认后再决定
# 死信记录内容
原始消息体(含无法解析时的原始字节)、消费时间、失败原因、堆栈摘要、追踪标识失败分类与处置
| 类型 | 判断依据 | 处置 |
|---|---|---|
| 可重试 | 网络抖动、下游短暂不可用 | 退避重试,超限转死信 |
| 不可重试 | 格式错误、校验失败 | 直接转死信并告警 |
| 未知 | 无法归类 | 限次重试后隔离待人工确认 |
反序列化失败的消息可能连头部都读不出来:仍要保留原始字节与来源队列信息,否则排查时没有任何线索。
无限重试是最常见的故障放大器:一条坏消息让消费位停住,队列积压,正常业务同时被卡住。