Build1 publisher3 min readPublished
RabbitMQ 4.2.2 drops global QoS and classic queue mirroring, so a Celery task with an ETA parks its worker until the ETA arrives. Because a queue's type is fixed at declaration, the fix has to land in the application first.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
Divide 8,000,000 by 86,400 and the average load is about 93 messages a second [15]. One broker node handles that without complaint. Throughput is not the wall. The wall is that RabbitMQ will not change a queue's type after the queue exists [5], and Kraken's SLAs do not allow the delete-and-recreate window that would normally follow [6].
The two removals in 4.2.2 point at the same target [2]. Losing classic queue mirroring forces the move to quorum queues [4]. Losing global QoS means a task carrying an ETA holds its worker until the ETA arrives [3], which is the opposite of offloading work. Celery's answer, Native Delayed Delivery, only runs on quorum queues bound to topic exchanges [7]. So the thing that breaks delayed tasks and the thing that forces the queue rewrite are both satisfied by one topology.
The flag that carries the migration is a single function. `build_queue` reads `USE_QUORUM_QUEUES` and flips two things at once: the `x-queue-type` queue argument, and the exchange type from `direct` to `topic` [9]. In the published snippet the exchange is also named after the queue type, so a pod with the flag off publishes to an exchange called `classic` and a pod with the flag on publishes to one called `quorum` [10]. Names chosen during a migration tend to outlive it. That naming is also the proof that this is a topology change and not a setting: two shapes of the application can run side by side, which is why a Kubernetes rolling update could leave some pods on the old vhost and some on the new one without harm [11].
Shovel was the obvious tool for moving the backlog between vhosts, and it was rejected for a precise reason: it copies messages as-is, `eta` header included [12]. Those messages would land in quorum queues still carrying the field that blocks a worker. The transfer therefore had to do what Celery does internally, popping the `eta` header, computing the delay-based routing key, and publishing to the matching exchange [13], with pika consuming and kombu's `native_delayed_delivery` helpers deriving the routing [14].
Whether that plan transfers to your system depends on three conditions the post makes visible. ETA or countdown has to be in real use, since that is where global QoS removal bites [3]. Two vhosts have to be able to run against the same broker for the length of the migration [8]. And a mixed fleet has to be acceptable, because the split between old and new pods is the mechanism rather than a side effect [11]. Shops that can take a maintenance window can delete and redeclare their queues and skip all of it.
The broker upgrade is the last phase [17]. Everything expensive happens while still on 3.13.7.1 [1]: provision `qhost`, teach the app both queue types, transform the backlog across, decommission `chost` [8]. By the time the version number changes, the old vhost holds nothing that could break.
Ranked by verification strength, evidence, and original report placement.
Kraken uses Celery to offload long-running tasks to workers via RabbitMQ v3.13.7.1.
Kraken's platform team needed to upgrade to RabbitMQ v4.2.2, which introduces breaking changes.
Global QoS removal in RabbitMQ v4 means ETA/countdown tasks now block workers until execution time, defeating the purpose of async processing.
Classic Queue Mirroring removal forces migration to quorum queues.
RabbitMQ does not let you change a queue's type after the queue is created.
Deleting and recreating queues was not an option because Kraken pushes 8M messages/day across many environments and its SLAs do not allow any downtime.
Follow any of these and your For You feed starts watching them — no settings page required.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One first-party account, code partly withheld
Everything traces to a single dev.to post by an engineer on the team that did the work, which is the most direct kind of single source and still a single source. It names versions and shows real code paths, but the author labels the snippets pseudocode, compute_countdown is called and never shown, and the text breaks off mid-sentence. The version-level assertions about v4.2.2 are exactly what RabbitMQ's release notes would settle, and no such reference appears anywhere in our coverage.
One team, three phases in
Phases one to three are reported as done: two vhosts live, pods carried across by a rolling update, a transfer daemon running in production. Decommissioning the old vhost and the broker upgrade itself remain future steps in the text. No other organisation is reported taking this route, and there is no post-migration measurement of throughput or losses to show the migrated path behaving.
Title outruns the text
The headline promises an upgrade to v4 that did not break 8M daily tasks; the body ends before the upgrade, and offers no loss, latency or duplicate figures to support the second half either. What sits underneath is careful and specific, so the overstatement lives in the packaging rather than in the engineering.
Reputation, not revenue
A practitioner post on a community platform with nothing to sell, where the return is peer credit and hiring visibility. That pulls towards a clean narrative: nothing in the account goes wrong, there is no rollback, no duplicate-delivery incident and no surprise during the window when both vhosts were serving. The technical choices are still argued on their merits, including the reasoning for turning down Shovel.
Firm on the problem, soft on the outcome
The immutability of queue type and Native Delayed Delivery's quorum-plus-topic requirement are cheap for any reader to confirm against the projects themselves, and the migration's shape follows from them. Whether Kraken actually carried 8M daily messages across with no downtime is visible only to Kraken, and the published text stops short of showing it.
build
A 28-host Debian 12 cutover, and the 02:13 failure Ansible could not have prevented1 publisher
build
Eleven terabytes of rasters, no raster database: the two decisions doing the work1 publisher
invest
Kraken's Krak Card is a deposit play wearing a debit card's clothes3 publishers
build
A linear conntrack scan holds Cilium pod setup for 80 seconds at Adyen's peak1 publisher
Publishers with included, body-backed reporting in this cluster.
1 article · September 8, 2026