Exchange とは何ですか? ルーティングキーとバインディングとは何ですか? エクスチェンジとキューはどのように関連付けられるのですか? また、いつ、どのように使用すればよいのでしょうか。 この記事では、RabbitMQのさまざまな種類のExchangeと、それらを使用する方法のシナリオを説明します。
メッセージは、キューに直接発行されるわけではありません。 その代わりに、プロデューサはメッセージをエクスチェンジに送信します。 エクスチェンジは、RabbitMQ内の仮想ホストによって定義されるメッセージルーティング・エージェントです。
バインディングは、キューをエクスチェンジにバインドするために設定する “リンク “です。
ルーティングキーは、メッセージをキューにルーティングする方法を決定する際に、交換が参照するメッセージ属性です (交換タイプに依存)。
交換、接続、およびキューは、耐久、一時、および作成時に自動削除などのパラメータで構成することができます。 Durable エクスチェンジは、サーバーの再起動に耐え、明示的に削除されるまで存続します。 一時的なエクスチェンジは、RabbitMQがシャットダウンされるまで存在します。 自動削除されたエクスチェンジは、最後にバインドされたオブジェクトがエクスチェンジからバインド解除されると削除されます。
RabbitMQ では、異なるパラメータとバインド設定を使用して異なるメッセージをルーティングする 4 種類のエクスチェンジが存在します。
- プロデューサーは、メッセージを交換に発行します。
- 交換はメッセージを受け取り、現在メッセージのルーティングに責任があります。 この場合、Exchange から 2 つの異なるキューへのバインディングがあります。 Exchangeはメッセージをキューにルーティングします。
- メッセージはコンシューマによって処理されるまでキューに留まります。
RabbitMQおよびメッセージキューイングに精通していない場合、「RabbitMQ for beginners – what is RabbitMQ?
直接交換
直接交換は、メッセージルーチングキーに基づいてキューにメッセージを配信します。 ルーティングキーは、プロデューサによってメッセージヘッダに追加されるメッセージ属性です。 メッセージは、メッセージのルーティングキーと正確に一致するバインドキーを持つキューに行きます。
Direct Exchange タイプは、単純な文字列識別子を使用して同じ Exchange に発行されたメッセージを区別するのに便利です。
AMQP ブローカーが直接交換のために提供しなければならないデフォルトの交換は “amq.direct” です。
下の画像(直接交換図)のキュー A(create_pdf_queue) は、バインドキーpdf_create で直接交換(pdf_events)に結合されていると想像してください。ルーティングキーpdf_createを持つ新しいメッセージが直接交換に到着すると、交換はbinding_key = routing_keyのキューに、この場合はキューA(create_pdf_queue)にそれをルーティングします。
Scenario 1
- Exchange: pdf_events
- Queue A: create_pdf_queue
- Exchange (pdf_events) とキューA (create_pdf_queue) 間のbinding keyを示します。 pdf_create
シナリオ2
- 交換: pdf_events
- キューB: pdf_log_queue
- 交換 (pdf_events) とキューB (pdf_log_queue) 間のバインドキー: pdf_log
例
例: ルーティングキーpdf_logを持つメッセージは、epdf_eventsに送られます。ルーティングキー(pdf_log)がバインディングキー(pdf_log)にマッチするので、メッセージはpdf_log_queueにルーティングされます。 メッセージは,バインディングキーがメッセージのルーティングキーと正確に一致するキューに行きます。
Default exchange
デフォルトの交換は,名前のない事前に宣言した直接交換で,通常は空文字列で参照されます。 default exchangeを使用すると、メッセージはメッセージのルーティングキーと同じ名前のキューに配信されます。 すべてのキューは、キュー名と同じルーティングキーを持つデフォルトエクスチェンジに自動的にバインドされます。
Topic Exchange
Topic Exchange は、ルーティングキーとキューバインドによって指定されるルーティングパターン間のワイルドカードのマッチに基づいて、キューにメッセージをルーティングします。
ルーティングキーは、ピリオド(.)で区切られた単語のリストでなければなりません。 例として、agreements.us および agreements.eu.stockholm があり、この場合、多くの異なる場所にオフィスを持つ企業用に設定された契約を識別します。 ルーティングパターンは、ルーティングキーの特定の位置の単語にマッチするように、アスタリスク(「*」)を含むことができる(例えば、「agreements.*.*.b.*」というルーティングパターンは、最初の単語が「agreements」、4番目の単語が「b」というルーティングキーにのみマッチする)。 ポンド記号 (「#」) は、0 個以上の単語の一致を示します (たとえば、「agreements.eu.berlin.#」というルーティング パターンは、「agreements.eu.berlin」で始まる任意のルーティング キーに一致します)。
消費者はどの話題に興味があるかを示します (個々のタグに対するフィード購読のようにします)。 コンシューマはキューを作成し、指定されたルーティング パターンを使用して、エクスチェンジへのバインドをセットアップします。 ルーティング パターンに一致するルーティング キーを持つすべてのメッセージはキューにルーティングされ、コンシューマーがメッセージを消費するまでそこにとどまります。
AMQP ブローカーがトピック交換のために提供しなければならないデフォルト交換は “amq.topic” です。
Scenario 1
右の画像は、消費者 A がベルリンのすべての協定に興味を持っている例を示しています。
- Exchange: agreements
- Queue A: berlin_agreements
- 交換(協定)とキュー A(berlin_agreements )間のルーティングパターン:協定、キューA、agreement の間のルーティングパターン:agreements.eu.berlin.#
- マッチするメッセージルーチングキーの例: agreements.eu.berlin と agreements.eu.berlin.headstore
シナリオ 2
Consumer B はすべての agreement に興味があります。
- 交換:agreements
- キューB:all_agreements
- 交換(agreements)とキューB(all_agreements)間のルーティングパターン:agreements.#
- 一致するメッセージ ルーティング キーの例: agreements.eu.berlin と agreements.us
Scenario 3
消費者Cは、ヨーロッパの本店に関するすべての協定に興味を持っています。
- Exchange: agreements
- Queue C: headstore_agreements
- Exchange (agreements) と Queue C (headstore_agreements) 間のルーティングパターン:agreements.eu.*.headstore
- マッチするメッセージのルーティングキーの例: agreements.eu.berlin.headstore と agreements.eu.stockholm.headstore
例
ルーティングキーagreements.のメッセージの例:agreements.Accounts.Accounts.Accounts.Activities.Activities.Activities.Activities.Activities。このメッセージは、”agreements.eu.berlin.#” のルーティングパターンが “agreements.eu.berlin” で始まるルーティングキーと一致するため、キューberlin_agreements にルーティングされます。 また,ルーティングキー(agreements.eu.berlin)がルーティングパターン(agreements.#)と一致するため,メッセージはqueueall_agreementsにルーティングされます。
Fanout Exchange
Fanout Exchangeはdirectおよびtopic exchanges同様ルーティングキーまたはパターンの一致にかかわらず受信メッセージをコピーして,それに結合するすべてのキューにルーティングします。 提供されたキーは単に無視されます。
Fanout Exchange は、同じメッセージを異なる方法で処理する消費者を持つ 1 つ以上のキューに同じメッセージを送信する必要がある場合に役立ちます。
右の画像 (Fanout Exchange) は、交換によって受け取ったメッセージが、交換に結合した 3 つのキューすべてにコピーおよびルートされた例を示しています。 たとえば、何かが起こったときに接続された各モバイル デバイスに送信されるべきスポーツまたは天気予報の更新である可能性があります。
AMQP ブローカーがトピック交換のために提供しなければならないデフォルト交換は “amq.fanout” です。
Scenario 1
- Exchange: sport_news
- Queue A: Mobile client queue A
- Binding: Exchange (sport_news) と Queue A (Mobile client queue A)
Example
A message is sent to the exchangesport_news.The message is routed to all queues (Queue A, Queue B, Queue C) because all queues are bound to the exchange.The message is built to all queues ⧏35⧐ メッセージがExchangeと同じキューに送られます。 提供されたルーティングキーは無視されます。
Headers Exchange
A headers exchange は、ヘッダーとオプション値を含む引数に基づき、メッセージをルーティングします。 Headers Exchangeはtopic exchangeに非常に似ていますが、ルーティングキーの代わりにヘッダー値に基づいてメッセージをルーティングします。
Exchange とキューの間のバインディングで追加された “x-match” という名前の特別な引数は、すべてのヘッダーが一致しなければならないか、1つだけ一致しなければならないかを指定します。 メッセージとバインディングの間の任意の共通ヘッダがマッチとしてカウントされるか、バインディングで参照されるすべてのヘッダがマッチするためにメッセージに存在する必要があるかのどちらかです。 x-match “プロパティは、2つの異なる値を持つことができます。 「any “または “all “で、”all “はデフォルト値である。 all “の値は、すべてのヘッダーペア(key, value)がマッチしなければならないことを意味し、”any “の値は、ヘッダーペアの少なくとも1つがマッチしなければならないことを意味する。 ヘッダーは、文字列の代わりに、例えば整数やハッシュなど、より広い範囲のデータ型を使用して構築することができる。 ヘッダー交換タイプ (バインド引数 “any” で使用) は、既知の (順序付けされていない) 基準のサブセットを含むメッセージを指示するのに便利です。
AMQP ブローカーがトピック交換に提供しなければならないデフォルトの交換は “amq.headers” です。 「
Dead Letter Exchange
一致するキューがメッセージのために見つからない場合、メッセージは静かに削除されます。 RabbitMQは、「Dead Letter Exchange」として知られるAMQP拡張機能を提供し、配信不可能なメッセージを捕捉する機能を提供します。
Please email us [email protected] missing content or other feedback.