升级 RabbitMQ v4 而不中断每日 800 万 Celery 任务
来源:dev.to — 2026-09-08
📋 概述
Kraken 平台团队用 Celery 把长任务卸载给基于 RabbitMQ v3.13.7.1 的 worker,如今必须升到 v4.2.2,而这次升级带来自带破坏性变更:全局 QoS 被移除(带 ETA 的任务会阻塞 worker 直到执行时刻),classic 队列镜像被移除(被迫迁到 quorum 队列)。在每日 800 万条消息、零停机容忍的 SLA 下,不能就地改队列类型、不能停服重建。幸运的是 Celery 的 Native Delayed Delivery 正好需要绑定到 topic 交换器的 quorum 队列,与迁移目标一致,于是他们设计了分期迁移方案。
🔑 核心要点
- 两大破坏性变更分别对应两种解法:全局 QoS 移除后,Celery 的Native Delayed Delivery特性得以解决 ETA 阻塞问题,但它要求 quorum 队列绑定 topic 交换器——恰好也是迁移的目标形态。
- 五步迁移策略:新建承载 quorum 队列的 qhost 虚拟主机、用功能开关让应用代码同时兼容两种队列类型、在不丢失 ETA 信息的前提下把消息从旧 chost 迁到新 qhost、随后下线 chost、最后对 RabbitMQ 做滚动升级到 v4。
- 难点在于RabbitMQ 不允许在队列创建后更改其类型,常规「删了重建」在 800 万消息/天与零停机 SLA 下不可行,只能靠并行 vhost + 逐步转移来达成平滑切换。
💡 金句
RabbitMQ doesn't let you change a queue's type after it's created.
👍 0
👎 0
← 返回 dev.to 首页