下游开始返回 429,MQ 重试次数从 0 涨到 16,消费组积压到 4 万条,下游日志里同一秒进来 300 个请求。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
# RocketMQ 重试间隔 单位秒 从 10 开始 # retryMaxTimes=16 建议压到 8 以内 SELECT topic, queue_id, count(*) FROM mq_consume_log WHERE retry_times > 3 GROUP BY topic, queue_id;
重试策略是固定间隔 1 秒、最多 16 次,失败消息和正常消息挤在同一个队列。下游限流每秒 50,重试流量叠上去直接打满,正常消息也跟着失败。这一点先确认清楚,后面就不用反复试。
「重试退避上限」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
具体做法是,重试间隔改成指数退避 从 5 秒开始翻倍 上限 5 分钟;重试超过 6 次转入独立重试队列 不抢正常消息的线程;消费端加令牌桶 按下游 QPS 限速;连续失败的批次先暂停消费 等下游恢复再放。
改完照着核一遍,重试队列堆积不再增长 下游 429 占比降到 1% 以下 正常消息延迟回到秒级。
