> Technically it could, of course, and we hear this request from time to time. Historically RabbitMQ stored almost exclusively transient messages. We had no stream support and no delayed messages, so such a mechanism was not really needed.
Yes, I can imagine I'm not the first to ask for this, and your point about transient messages is totally fair.
> people really should upgrade their software from time to time
No doubt about that, but not all of your users are perfect :) Postponing an upgrade tends to make the next one more painful, and the prospect of that pain makes it even easier to postpone it further. Though I must admit this is a common software maintenance problem, not something unique to RabbitMQ :D
> Those who want to avoid it as much as possible can take advantage of the commercial extended support, so they can upgrade less often. But there are still occasional migrations where this could be useful.
Commercial extended support lets you enjoy life a little longer before you eventually have to upgrade. But when that day comes, you still have to juggle multiple RabbitMQ versions and their runtime dependencies, potentially including different kernel versions in the worst caseю Admittedly, the kernel example is an extreme case, I promise to stop bringing it up now :). I'm not familiar with the details of the commercial support offering, but I doubt it magically allows you to skip intermediate upgrade steps. Please correct me if I'm wrong.
> How much are your messages delayed for? We assume the vast majority of users delay messages for no more than a few days. In such case, just leaving the old cluster running until it's empty, should be a decent workaround for now. It certainly should not prevent anyone from adopting a new version.
As I mentioned, I'm upgrading from an ancient version, so I'm not using native delayed messages or delayed retries yet. For now, we rely on the good old retry-queue pattern with message TTLs.
However, when it comes to progressively increasing retry delays (which native delayed retries provide), this pattern gets rather ugly. You end up needing multiple queues because of head-of-line blocking: with per-message TTLs, a message with a longer TTL can prevent a later message with a shorter TTL from being retried on time. So you eventually end up with something like a queue per TTL value.
The removal of mirroring support for classic queues makes things even more complicated. With classic queues, you could at least use `x-expires` to automatically clean up unused retry queues. This makes switching to native delayed retries very tempting, but the upgrade concern might become a blocker. With ordinary retry queues, you can at least shovel messages elsewhere, even if you have to do it manually.
As for leaving the old cluster running for a few days, I don't think it's quite that simple. To actually drain it, you need to stop publishing new messages to it. That means either stopping the relevant parts of your applications for several days or making them work with two clusters during the transition.
And making applications handle two clusters correctly might introduce even more complexity than a proper step-by-step upgrade.
Thanks for being understanding and for taking the time to explore possible workarounds!