サービス指向アーキテクチャのメッセージ キューとして RabbitMQ を使用しています。多くの個別の Web サービスが RabbitMQ キューにバインドされたメッセージを発行します。これらのキューは、バックグラウンド作業を実行するさまざまなコンシューマーによってサブスクライブされます。RabbitMQ の非常にバニラなユースケースです。
ここで、いくつかのキュー パラメータを変更したいと考えています (具体的には、特定のルーティング キーを使用してキューを新しいデッド レター交換にバインドしたいと考えています)。私の問題は、実稼働システムでこの変更を行うことが、いくつかの理由で問題があることです。
本番システムでメッセージを失わずにこれらの新しいキューに移行するための最良の方法は何ですか?
キュー名のバージョン管理から、新しい設定で新しい仮想ホストを作成すること、すべての変更を適切に行うことまで、すべてを検討しました。
ここに私が直面している問題のいくつかがあります:
RabbitMQ キューは冪等であるため、異種の Web サービスは、公開する前にキューを宣言しています (キューがまだ存在しない場合)。キューのパラメーターを変更すると (ただし、同じルーティング キーを維持する)、キューの宣言は失敗し、RabbitMQ はチャネルを閉じます。
キューを変更するときにメッセージを失わないようにしたいです (ここでは、メッセージを保存してから新しいキューに再発行する排他的なコンシューマーをサブスクライブすることを計画しています)。
異なるパブリッシャーと消費者ベースの間の一般的な調整 (または、さらに良いことに、それらを調整する必要を回避する方法)。