热循环(Hot Loop / Hot Cycling)介绍(消息反复消费、反复失败、反复重新入队、反复重试)message.redelivered、毒消息流程:记指标 + 丢弃

发布时间:2026/7/31 19:41:20
热循环(Hot Loop / Hot Cycling)介绍(消息反复消费、反复失败、反复重新入队、反复重试)message.redelivered、毒消息流程:记指标 + 丢弃 现在瞬时失败传输、5xx恰好重新入队一次message.redelivered 防止热循环热循环是什么文章目录热循环Hot Loop / Hot Cycling一句话定义用第 3 条的场景举例为什么危险文中怎么防止热循环类比热循环Hot Loop / Hot Cycling一句话定义热循环是指一条有问题的消息被反复消费、反复失败、反复重新入队形成一个停不下来的死循环像发动机空转一样快速烧资源。用第 3 条的场景举例消息队列里有一条毒消息比如数据格式错了 │ ▼ 消费者拿到消息 → upsert 失败数据校验不通过4xx 错误 │ ▼ 消费者没有 ACK → 消息队列认为没处理完把消息重新放回队列 │ ▼ 消费者立刻又拿到同一条消息 → 又失败 │ ▼ 又没 ACK → 又放回队列 → 又消费 → 又失败 → 又放回... │ ▼ ♻️ 无限循环每秒可能重复几十上百次这就是热循环——消息在队列和消费者之间飞速弹跳永远处理不成功但永远在重试。为什么危险危害说明CPU / 资源空转消费者不停处理同一条注定失败的消息浪费算力队列堵塞这条消息占住消费者正常的消息排不上队日志洪泛每次失败都记日志瞬间产生海量无用日志指标失真失败次数飙升监控告警被淹没级联故障如果失败涉及外部调用如数据库会把下游也拖垮文中怎么防止热循环瞬时失败恰好重新入队一次message.redelivered防止热循环第 1 次消费 → 失败网络抖动 5xx │ ▼ 检查 message.redelivered false ← 还没重试过 │ ▼ 重新入队NACK允许重试一次 │ ▼ 第 2 次消费 → 又失败 │ ▼ 检查 message.redelivered true ← 已经重试过了 │ ▼ 不再重新入队走毒消息流程记指标 丢弃 │ ✅ 循环终止message.redelivered是消息队列如 RabbitMQ提供的一个标志位false 第一次被消费 → 可以给一次重试机会true 已经被重新投递过了 → 不再重试直接丢弃这样就把重试次数硬限制为 1 次彻底打断了热循环。类比想象一台自动售货机正常情况投币 → 出货 → 完成 ✅热循环投币 → 卡住了 → 机器退币 → 你立刻又投同一枚币 → 又卡住 → 又退币 → 又投… 你俩都停不下来了 防热循环机器说同一枚币只允许投两次第二次再卡住我就吞币报修