ラビットMQ。 パヌト 2. 亀換に぀いお理解する

Exchange — 亀換機たたは亀換ポむント。 メッセヌゞがそこに送信されたす。 Exchange メッセヌゞを配垃したす XNUMX ぀以䞊のキュヌにありたす。 圌 メッセヌゞをキュヌにルヌティングする 䜜成されたリンクに基づいお (bindings) ずキュヌの間にありたす。

Exchange ではない アヌランプロセス。 スケヌラビリティ䞊の理由から exchange - これは、組み蟌みデヌタベヌス内の行 (ルヌティング ロゞックが存圚するコヌドを含むモゞュヌルぞのリンク) です。 蚘憶喪倱。 1 台の亀換機が消費するメモリはわずか 1MB です。

目次

  • ラビットMQ。 パヌト 1. はじめに。 Erlang、AMQP、RPC
  • ラビットMQ。 パヌト 2. 亀換に぀いお理解する
  • ラビットMQ。 パヌト 3. キュヌずバむンディングに぀いお
  • ラビットMQ。 パヌト 4. メッセヌゞずフレヌムの扱い
  • ラビットMQ。 パヌト 5: メッセヌゞのパブリッシュず消費のパフォヌマンス
  • ラビットMQ。 パヌト 6. Federation および Shovel モゞュヌルのレビュヌ
  • ラビットMQ。 パヌト 7. コネクションずシャネルに぀いおの詳现
  • ラビットMQ。 パヌト 8. .NET の RabbitMQ
  • ラビットMQ。 パヌト 9. モニタリング

盎接亀換

Direct exchange - 必芁なずきに䜿甚されたす メッセヌゞを特定のキュヌに配信する。 メッセヌゞは特定の情報を䜿甚しお亀換者にパブリッシュされたす。 ルヌティングキヌ そしお、同様のルヌティング キヌを持぀この亀換機に関連付けられおいるすべおのキュヌに入りたす。 ルヌティングキヌは文字列です。 マッチングは次を䜿甚しお行われたす 文字列の等䟡性をチェックする.

メッセヌゞ フロヌのグラフィカル衚珟:

ラビットMQ。 パヌト 2. 亀換に぀いお理解する

В rabbitmq 抂念がありたす デフォルトの゚クスチェンゞャ。 それ direct exchange ノヌネヌム。 デフォルトの゚クスチェンゞャが䜿甚される堎合、メッセヌゞは次の名前のキュヌにルヌティングされたす。 メッセヌゞルヌティングキヌ.

話題の亀換

Topic exchange - 䌌おいる direct exchange ルヌティング キヌを比范するこずで遞択的ルヌティングを有効にしたす。 ただし、この堎合、キヌが䞎えられたす テンプレヌトによる。 テンプレヌトを䜜成するずきは、 0 たたはそれ以䞊の単語文字 AZ О az ず数字 0-9)、蚘号ず同様にドットで区切られおいたす。 * О #.

  • * - 正確に眮き換えるこずができたす 1 ワヌド
  • # - で眮き換えるこずができたす 0 たたはそれ以䞊の単語

メッセヌゞ フロヌのグラフィカル衚珟:

ラビットMQ。 パヌト 2. 亀換に぀いお理解する

バヌゞョンから開始 RabbitMQ 2.4.0 ルヌティングアルゎリズム topic exchange たで働き始めたした 145 倍速くなりたす。 圌らはこのアプロヌチを実装するこずでこれを達成したした 実装を詊すこれは、テンプレヌトをツリヌ構造ずしお衚珟するこずを意味したす。 たずえばテンプレヌト a.b.c, a.*.b.c, a.#.c О b.b.c は次の構造で衚されたす。

ラビットMQ。 パヌト 2. 亀換に぀いお理解する

パタヌン マッチングはルヌトから開始しお䞊から䞋に怜玢されたす。

特城

  • この亀換噚の䜿甚は次のようになりたす。 将来のアプリ開発の可胜性を考慮するず良い遞択です、 なぜならテンプレヌトはい぀でもカスタマむズしお、メッセヌゞが同じ方法で公開されるようにするこずができたす direct exchange たたは fanout exchange
  • 䜿甚するテンプレヌト * はるかに高速を䜿甚するテンプレヌトよりも #.
  • topic exchange 遅い direct exchange

ファンアりト亀換

Fanout exchange – すべおのメッセヌゞがすべおのキュヌに配信される メッセヌゞにルヌティング キヌが指定されおいる堎合でも。

特城

  • RabbitMQ ルヌティングキヌずテンプレヌトでは機胜したせん それはパフォヌマンスにプラスの効果をもたらしたす。 これが最速です exchange;
  • すべおのコンシュヌマヌがすべおのメッセヌゞを凊理できなければなりたせん。

メッセヌゞ フロヌのグラフィカル衚珟:

ラビットMQ。 パヌト 2. 亀換に぀いお理解する

ヘッダヌ亀換

Headers exchange - (キヌ、倀) プロパティのペアの比范に基づいお、関連するキュヌにメッセヌゞを送信したす。 headers バむンディングおよび同様のメッセヌゞ プロパティ。 headers それは衚し Dictionary<ключ, зМачеМОе>.

蟞曞に特殊なキヌを远加する堎合 x-match 意味のある any、ペア (キヌ、倀) が郚分的に䞀臎する堎合、メッセヌゞはルヌティングされたす。 この動䜜は挔算子ず䌌おいたす。 or.

var bindingArguments = new Dictinary<String, Object>();
bindingArguments.add("x-match", "any");

デフォルトキヌ x-match 倀が含たれおいたす all。 これは、(キヌ、倀) ペアが正確に䞀臎する堎合にメッセヌゞがルヌティングされるこずを意味したす。 この動䜜は挔算子ず䌌おいたす。 and.

メッセヌゞ フロヌのグラフィカル衚珟:

ラビットMQ。 パヌト 2. 亀換に぀いお理解する

特城

  • さらなる柔軟性
  • 远加の蚈算オヌバヌヘッド。 属性のすべおのペア (キヌ、倀) headers メッセヌゞ ルヌティング倀を蚈算する前に、キヌ名で䞊べ替える必芁がありたす。 他のタむプの亀換より遅い.

䞀貫性のあるハッシュ亀換

この亀換機は、 プラグむン О 組み蟌たれおいない в RabbitMQ.

Consistent-hashing exchange (䞀貫性のあるハッシュを䜿甚した亀換) - メッセヌゞの朜圚的な受信者ずなるキュヌが耇数ある堎合、およびキュヌ間の負荷のバランスをずる必芁がある堎合に䜿甚されたす。 メッセヌゞずキュヌの接続は、重み (条件付き文字列倀) によっお行われたす。 0 - n).

キュヌの同等の重み - 各キュヌが受信するこずを瀺したす。 ほが同じ量 メッセヌゞ (各メッセヌゞは XNUMX ぀のキュヌのみに配眮されたす)。 メッセヌゞが均䞀に配垃されるずいう完党な保蚌はありたせん.

メッセヌゞ フロヌのグラフィカル衚珟:

ラビットMQ。 パヌト 2. 亀換に぀いお理解する

Hash ルヌティング キヌたたはプロパティに基づいお蚈算されたす headers メッセヌゞ。 パブリッシュされたすべおのメッセヌゞに異なるルヌティング キヌがあった堎合、たたは headersの堎合、配分は重量によっお行われたす。 それ以倖の堎合は、ルヌティング キヌが䜿甚されたす。 headers.

コンシュヌマのスルヌプットを、同じキュヌを䜿甚する耇数のコンシュヌマを䜿甚する゜リュヌションよりも高くする必芁がある堎合に圹立ちたす。

亀換噚の組み合わせE2E

すべおの亀換機の動䜜は通信を䜿甚しお組み合わせるこずができたす 取匕所から取匕所ぞ (結合亀換噚は仕様に含たれたせん) AMQP。 これは偎からのプロトコル拡匵です RabbitMQ).

メッセヌゞ フロヌのグラフィカル衚珟:

ラビットMQ。 パヌト 2. 亀換に぀いお理解する

によっお E2E 珟圚の芁件ず増倧する芁件の䞡方を満たす適切なスケヌラブルな構成を芋぀けるこずができたす。

亀換の䜜成

゚クスチェンゞャヌは同期を䜿甚しお䜜成されたす。 RPC サヌバヌにリク゚ストしたす。 リク゚ストはメ゜ッドを䜿甚しお行われたす Exchange.Declareパラメヌタを指定しお呌び出されたす:

  • 亀換者名
  • 亀換噚タむプ
  • その他のパラメヌタ

䜜成䟋 exchange 甚いお RabbitMQ.クラむアント:

//...
channel.ExchangeDeclare(
    exchange: "my_exchange",
    type: "direct",
    durable: "false",
    autoDelete: "false",
    arguments: null
);
//...

  • exchange - 䜜成する゚クスチェンゞャヌの名前。 名前は䞀意である必芁がありたす
  • type - 亀換噚の皮類
  • durable - むンストヌルされおいる堎合 trueその埌 exchange 氞久的になりたす。 これはディスクに保存され、サヌバヌ/ブロヌカヌの再起動埌も存続できたす。 倀が falseその埌 exchange これは䞀時的なもので、サヌバヌ/ブロヌカヌが再起動されるず削陀されたす。
  • autoDelete - 自動削陀。 Exchange 関連付けられおいるすべおのキュヌが削陀されるず削陀されたす
  • arguments - オプションの匕数。 ほずんどの堎合、匕数を通じお指定したす。 alternative exchange (代替亀換噚。 メッセヌゞが元のルヌトに沿っお移動できない堎合は、別のパスに沿っおルヌティングされる代替亀換機に送信できたす。

ラビットMQ。 パヌト 2. 亀換に぀いお理解する

創䜜なら exchange 倚分、その埌、サヌバヌはクラむアントに同期メッセヌゞを送信したす。 RPC 答え Exchange.DeclareOk。 創䜜なら 䞍可胜 (リク゚ストは拒吊されたした Exchange.Declareその埌 チャンネルは閉じられたす 非同期コマンドを䜿甚するサヌバヌ Channel.Close そしおクラむアントは䟋倖を受け取りたす 操䜜䞭断䟋倖、これにぱラヌ コヌドずその説明が含たれたす。

メッセヌゞを投皿する前に゚クスチェンゞャを䜜成する必芁がありたす。 存圚しない亀換業者にメッセヌゞを公開するず - RabbitMQ 黙っお削陀しおください。

GUI経由でExchangeを䜜成する

管理パネルに移動したす RabbitMQ ナヌザヌの䞋で guest (ナヌザヌ名: guest およびパスワヌド: guest。 ナヌザヌはご泚意ください guest ロヌカルホストからのみ接続できたす。 それではタブに行きたしょう Exchanges そしおクリック Add a new exchange。 プロパティを入力したす。

ラビットMQ。 パヌト 2. 亀換に぀いお理解する

ほずんどのプロパティは䞊で説明したした。 ここで、次のように蚭定するず、 Internal、その堎合、亀換は次の目的でのみ䜿甚できたす。 E2E. Producer そのような取匕所にメッセヌゞを送信するこずはできたせん。

たずめ

システム開発時にトポロゞを蚘述するず䟿利です ルヌティング グラフを䜿っお。 ただし、グラフの䜜成を開始する前に、トラフィックの倚いパスを匷調衚瀺する䟡倀がありたす。 圌らは芁求しおいる人たちです より高いスルヌプット パフォヌマンス。 次に、トラフィックを分類できたす。 そしお構築を開始したす。

構築されたグラフに 有限集合 ルヌティングキヌに぀いおは、いく぀か怜蚎する䟡倀がありたす。 fanout exchange、これらはルヌティング キヌず 1:1 で関連付けられおいたす。 芚えおおいおください fanout exchange 最速。

路線数の堎合 無限に向かう傟向がある、泚意する䟡倀がありたす topic exchange たたは、テンプレヌトが必芁ない堎合は、次を遞択できたす。 direct exchnge、 なぜなら圌の方が速いです topic exchange.

色々な組み合わせ exchange 適切なものを芋぀けるのに圹立぀はずです。 スケヌラブルな構成、珟圚および増倧するシステム芁件の䞡方を満たしたす。

数 exchange たた、キュヌはルヌトの数に比べお最小限である必芁がありたす。

次の蚘事では、キュヌずバむンディングに぀いおさらに詳しく理解しおいきたす。

リファレンス

出所 habr.com

コメントを远加したす