1.定義
メッセージキュー:メッセージの送信中にメッセージを保持するコンテナ。
これはより古典的なコンシューマープロデューサーモデルで、より抽象的で類似しています。AスレッドはBスレッドにメッセージを送信する必要があります(AスレッドとBスレッドは必ずしも同じマシン上にある必要はありません)。メッセージキューサーバーに送信された後、Bスレッドがメッセージサーバー上のメッセージキュー内のメッセージを読み取るかサブスクライブします。スレッドAとBの間には直接の通信はありません。MQサーバーは中間でリレーとして機能します。
2.該当するシナリオ
非同期伝送により適しています。
非同期:送信者はメッセージが正常に送信されたかどうかを気にせず、メッセージを送信するだけで、メッセージが正常に送信されたかどうかは取得しません。
同期:送信者はメッセージが正常に送信されたかどうかを懸念しています。メッセージの送信後、受信者がステータスコードを返すまで待機し、ステータスコードに従ってメッセージが正常に送信されたかどうかを判断して、対応するアクションを実行します。
例として、HTTPで同期および非同期を考えます。
たとえば、一般的なB / Sアーキテクチャのクライアントとサーバー間の通信は同期的です。つまり、要求を送信します—>サーバーが処理してメッセージを返すのを待つ—>サーバーによって返されたメッセージを取得し、プロセスが完了します。
たとえば、Ajaxテクノロジーは非同期であり、リクエストはイベントによってトリガーされます->サーバーの処理(ブラウザーは待機する必要がなく、他のことを実行できます)->処理が完了します。
3. RabbitMQ
メッセージキューには、RabbitMQ、Redis、ZeroMQ、ActiveMQ、Jafka / Kafkaなど、同様の製品が多数あります。
RabbitMQはAMQP(Advanced Message Queuing Protocol)の標準的な実装であり、その簡単な紹介は、http://www.rabbitmq.com/getstarted.htmlで確認できます。
3.1役割の概念
すべてのオープンソースプロジェクトには独自の設計方法とモジュールの役割があり、RabbitMQも例外ではありません。構造図は次のとおりです。
ブローカー:メッセージキューサーバーエンティティ
Exchange:メッセージ交換。メッセージがどのキューにルーティングされるかを指定します。
キュー:メッセージキューキャリア。各メッセージは1つ以上のキューに入れられます。
バインディング:バインディング。その役割は、ルーティングルールに従って交換とキューをバインドすることです。
ルーティングキー:ルーティングキー、エクスチェンジはこのキーに基づいてメッセージを配信します。
vhost:仮想ホスト。複数のvhostをブローカーに設定して、異なるユーザーの権限を分離できます。
プロデューサー:メッセージプロデューサーは、メッセージを配信するプログラムです。
コンシューマー:メッセージコンシューマーは、メッセージを受信するプログラムです。
channel:メッセージチャネルクライアントの各接続では、複数のチャネルを確立でき、各チャネルはセッションタスクを表します。
3.2作業プロセス
- プロデューサークライアント:
- クライアントはRabbitMQサーバーに接続し、メッセージチャネル(チャネル)を開きます。
- クライアントはメッセージ交換(交換)を宣言し、関連する属性を設定します。
- クライアントはメッセージキュー(キュー)を宣言し、関連するプロパティを設定します。
- クライアントはルーティングキーを使用して、メッセージ交換(交換)とメッセージキュー(キュー)の間のバインディング関係を確立します。
- クライアントメッセージはメッセージ交換(交換)に配信されます。
- クライアントはメッセージチャネル(チャネル)とサーバーとの接続を閉じます。
- サーバー側:
交換がメッセージを受信すると、メッセージキーと設定されたバインディングに基づいてメッセージルーティングを実行し、メッセージを1つ以上のメッセージキューに配信します。
交換にはいくつかのタイプもあります。
(1)。ダイレクトスイッチ:キーに基づいて配信します。たとえば、バインド中にバインドキーがabcに設定されている場合、クライアントが情報を送信すると、abcに設定されたキーのみがキューにポストされます。
(2)。トピックスイッチ:パターンマッチング後にキーを配信します。例:記号「#」は1つ以上の文字と一致し、記号「*
」は一連の連続するアルファベット文字と一致します。たとえば、「abc。#」は「abc.def.ghi」と一致でき、「abc。
*」は一致のみ可能です「Abc.def」。
(3)。ファンアウトスイッチ:ブロードキャストモードを採用しており、メッセージが着信すると、スイッチにバインドされているすべてのキューに配信されます。
- 消費者クライアント:(
まだ調査されていません)
3.3 RabbitMQメッセージの永続性
RabbitMQはデータの永続性をサポートします。つまり、ディスクにデータを書き込むとデータのセキュリティが向上します。メッセージキューの永続性には3つの部分があります。
- メッセージ交換(交換)の永続性。宣言するとき、durableを1に指定します
- メッセージキュー(キュー)の永続性。宣言するときに、durableを1に指定します
- メッセージの永続性、配信時にdelivery_modeを2に指定(1は非永続)
メッセージ交換(交換)とメッセージキュー(キュー)の両方が永続的である場合、それらの間のバインディング(Binding)も永続的です。メッセージ交換とメッセージキューの間に永続的および非永続的がある場合、バインドは許可されません。