シャベルとキューは、ある RabbitMQ ノードから別のノードにメッセージを転送するためのさまざまな手段を提供します。
フェデレーテッド エクスチェンジ
フェデレーテッド エクスチェンジでは、キューを上流 (ソース) ノードのキューに接続できます。さらに、下流 (宛先) ノードでの交換は、上流ノードに発行されたメッセージのコピーを受け取ります。
フェデレーテッド エクスチェンジは、(オプションで) アップストリーム エクスチェンジからの限定されたメッセージ セットをサブスクライブできるという点で、エクスチェンジ間バインディングに似ています。
フェデレーテッド キュー
(注: これらは RabbitMQ 3.2.x の新機能です)
フェデレーション キューを使用すると、コンシューマーは上流 (ソース) ノードと下流 (宛先) ノードの両方でキューに接続できます。
本質的に、ダウンストリーム キューはアップストリーム キューのコンシューマーであり、アップストリーム キューにアタッチされたコンシューマーと同じ方法でメッセージを処理する追加のダウンストリーム コンシューマーが存在することが期待されます。
ダウンストリーム (フェデレーション) キューによって消費されるメッセージは、アップストリーム キューのコンシューマーには利用できません。
使用事例:
コンシューマがあるノードから別のノードに移行されている場合、フェデレーテッド キューを使用すると、メッセージが失われたり、2 回処理されたりすることなく、これを行うことができます。
ユースケース: RabbitMQ ドキュメントから
典型的な用途は、同じ「論理」キューを多くのブローカーに分散させることです。各ブローカーは、他のすべてのフェデレーテッド キューと共にフェデレーテッド キューを上流に宣言します。(リンクは、n 個のキューで完全な双方向グラフを形成します。)
シャベル
一方、シャベルは、「上流」キューを「下流」交換に接続します。(ショベルのドキュメントではフェデレーションのドキュメントと同じセマンティクスでノードを説明していないため、用語を引用符で囲みます。)
シャベルはキューからメッセージを消費し、宛先ノードの交換に送信します。(注: 通常、このパターンの一部として議論されることはありませんが、コンシューマーが起点ノードのキューに接続するのを止めるものは何もありません。)
特定の質問に答えるには:
フェデレーションを選択したときに欠けているシャベルの細かい制御は何ですか?
シャベルは「上流」または「下流」ノードに存在する必要はありません。独立したノードから構成および操作できます。
シャベルは、リンケージのすべての要素 (ソース キュー、キューのバインディング、および宛先交換) をそれ自体で作成できます。したがって、送信元ノードにも宛先ノードにも侵襲的ではありません。
ショベルを使用する場合に仮想ホスト間通信を変更する唯一の方法は、構成ファイルを変更してインスタンスを再起動することであるというのは正しいですか?
これは一般に、シャベルの欠点として受け入れられています。
次のコマンド (注意: RabbitMQ 3.1.x でのみテストされ、rabbitmq.config
のみを含む非常に特殊なファイルを使用) を使用すると、指定したファイルから shovel 構成をリロードできます。(この場合/etc/rabbitmq/rabbitmq.config
)
rabbitmqctl eval 'application:stop(rabbitmq_shovel), {ok, [[{rabbit, _}|[{rabbitmq_shovel, [{shovels, Shovels}] }]]]} = file:consult("/etc/rabbitmq/rabbitmq.config"), application:set_env(rabbitmq_shovel, shovels, Shovels), application:start(rabbitmq_shovel).'
.
セットアップ (アプリケーションごとの vhost) は理にかなっていますか、それとも要点を完全に見逃していますか?
この決定は、ユースケースによって異なります。仮想ホストは主に、キュー/エクスチェンジと承認されたユーザーの間の論理 (およびアクセス) 分離を提供します。