毒消息治理

反复处理失败且阻塞队列的消息要尽快隔离:区分可重试(依赖临时故障)与不可重试(格式错误)两类,限次重试后转死信并告警。

什么是毒消息治理

毒消息指反复处理失败并阻塞队列的消息。治理要点是先分类再处置:因网络抖动、下游短暂不可用导致的失败属可重试,按退避策略重试;因格式错误、校验失败导致的失败属不可重试,应立即隔离避免无效重试。超过重试上限的消息转入死信通道并触发告警,同时保留原始内容与失败原因用于补数与排查。

基本信息

两类失败可重试(依赖临时故障)与不可重试(消息本身有问题)
重试策略指数退避加重试上限,避免同步重试放大压力
隔离机制超限转死信通道,保留原消息、失败原因与追踪标识
告警要求死信数量与增速要进监控,避免坏消息静默堆积

典型使用场景

  • 消息消费链路:消费者遇到处理异常时按错误类型选择重试或隔离
  • 批量导入:单条记录格式错误时跳过并记录,不能阻塞整批
  • 跨系统对接:对方字段变更导致解析失败,需要立即隔离并通知对接方
  • 高峰保护:下游限流时退避重试,避免同步重试把下游压垮
  • 补数场景:死信修复后按原始内容重投,验证幂等与顺序要求
  • 灰度变更:新版本消费者上线后出现大量死信,及时回退版本

处理策略与死信记录

处理策略与死信记录
# 分类处置
可重试错误(超时、连接失败、下游 5xx)
    -> 指数退避重试:1s / 5s / 25s,累计 5 次后转死信
不可重试错误(反序列化失败、字段校验失败、业务规则拒绝)
    -> 立即转死信,避免无效重试占用消费位
未知错误
    -> 保守限次重试后隔离,人工确认后再决定

# 死信记录内容
原始消息体(含无法解析时的原始字节)、消费时间、失败原因、堆栈摘要、追踪标识

失败分类与处置

类型判断依据处置
可重试网络抖动、下游短暂不可用退避重试,超限转死信
不可重试格式错误、校验失败直接转死信并告警
未知无法归类限次重试后隔离待人工确认
反序列化失败的消息可能连头部都读不出来:仍要保留原始字节与来源队列信息,否则排查时没有任何线索。
无限重试是最常见的故障放大器:一条坏消息让消费位停住,队列积压,正常业务同时被卡住。

易错点

  • 格式错误的消息无限重试,阻塞分区消费,正常消息全部积压
  • 毒消息被直接丢弃,丢失原始内容与线索,补数无从下手
  • 重试不做退避,同步高频重试把本已吃紧的下游彻底打垮
  • 死信通道没有告警与处理流程,坏消息长期堆积无人知晓

数据来源与参考

  • AWS 文档:SQS 死信队列与毒消息处理
  • 《Enterprise Integration Patterns》(Hohpe & Woolf)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌