msg.get('retry_count', 0)
msg.get('version', 1)
rabbitmqctl list_queues name messages consumers
发布过程中有 3 分钟新旧 worker 混跑,旧 worker 消费到新格式消息,日志里刷 KeyError: 'retry_count',任务直接失败。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,新版本给消息体加了字段,旧代码用 msg['retry_count'] 直接取,缺少字段就抛异常。消息格式没有版本号,消费端也没做兼容。
「消费者版本不一致」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
处理上按这个顺序:消息体加 version 字段 消费端按版本分支处理;新字段一律用 get 取 给默认值;发布顺序改成先升级消费端再升级生产端;旧 worker 下线前确认队列里没有新格式消息。
改完只确认一件事:滚动发布期间新旧 worker 混跑 5 分钟 日志里没有 KeyError 消息成功数和服务数一致。
