高可用性のためにクラスタを作成し、このクラスタのロードバランサフロントを配置したいとします。私たちの設定では、交換とキューを手動で作成したいので、1つの交換とキューが作成されます。クライアントはそれらを再宣言する必要はありません。私はルーティングキーとの直接交換を使用しているので、異なるノード上の異なるキューにメッセージをルーティングすることが可能です。しかし、私はクラスタリングとキューに関するいくつかの問題があります。クラスタ内でRabbitMQノードの障害を処理して公開および使用を継続する
私がRabbitMQのドキュメントを読む限り、キューは作成されたノードに固有です。さらに、パブリッシュ/コンシューム操作時に生存しているはずのクラスター内に、同じ名前のキューを1つしか配置できません。ノードが消滅した場合、そのノードのキューは消え、メッセージは復元されません(もちろん構成によって異なります)。したがって、たとえ同じメッセージを別のノードの別のキューにルーティングしても、メッセージを消費し続けるためにそれらを使用する方法を把握する必要があります。
ミラー化されたキューを使用せずにこのフェールオーバーのシナリオを処理できるかどうかは疑問です。障害が発生した場合に新しいノードに切り替えて、同じキューから継続して消費したいとします。パブリッシャはルーティングキーを使用しているだけで、これらのメッセージは複数のキューに入る可能性があるため、コンシューマにとって同じ状況は不可能です。
要するに、最初の段落で説明した環境での失敗にどう対処することができますか。キューミラーリングは、クラスター内でのパフォーマンスの低下や、より実用的なソリューションが存在する最善の方法です。
ノード内の既存の交換/キュー(変更不可能な場合)を再宣言することは冪等であり、新しい接続が確立されるたびに再宣言を行うことができます。それはあなたの提案ですか? – Deniz
@Denizはいクライアントが必要とするキュー/エクスチェンジを宣言するだけです。出版社は交換を宣言する必要があります。消費者は交換とキューを宣言する必要があります –
ヒントのためにありがとうアレックス。私はあなたの解決策が耐えられないキューのために有効であるように耐久性のあるキューを再宣言することは不可能だと思いますか? – Deniz