4

私はRabbitMQを使用してAMQPでRPCモデルを読んでいました。チュートリアルでは、一時キューとも作成しますcorrelationId。一時キューは一意ですが、なぜcorrelationIdが必要なのですか?私はJMSの人です。JMSでは、次の2つの方法で要求/応答を行います。

  1. 要求/応答ごとに一時キューを作成します

  2. 1つの応答キューを作成しcorrelationId、メッセージセレクターを使用します。

correlationId一時キューとAMQPRPCモデルの両方が必要な理由を誰かが説明できますか?AMQPにはメッセージセレクターのようなものがないようです。私は正しいですか?

4

1 に答える 1

8

正しい一時キューは、RPC要求を行うクライアントに固有です。RPCクライアントを作成して、一意のリクエストごとに一意のキューを作成することもできますが、それは非効率的です。ここでCorrelationIdの最初の段落を参照してください。

上記の方法では、RPCリクエストごとにコールバックキューを作成することをお勧めします。これはかなり非効率的ですが、幸いなことに、より良い方法があります。クライアントごとに1つのコールバックキューを作成しましょう。

したがって、より良い方法は、RPCクライアントが応答を返す1つのキューを用意し、correlationIdを使用して、RPCクライアントが行う要求をRPCサーバーが送り返す結果に一致させることです。

...そのキューで応答を受信したため、応答がどの要求に属しているかが明確ではありません。そのとき、correlation_idプロパティが使用されます。リクエストごとに一意の値に設定します。後で、コールバックキューでメッセージを受信すると、このプロパティを確認し、それに基づいて応答と要求を照合できるようになります。不明なcorrelation_id値が見つかった場合、メッセージを安全に破棄できます。これはリクエストに属していません。

したがって、RPCチュートリアルの概要セクションを参照してください。

  • クライアントが起動すると、排他的で一意のキューが作成されます
  • RPC要求を送信するとき、キュー名であるreply_toを設定し(サーバーは応答を送信するキューを認識します)、RPC要求ごとに一意の値であるcorrelationIdも設定します。
  • リクエストはRPCキューに送信されます
  • RPCワーカー(またはサーバー)は要求を受信して​​処理し、reply_to値を使用して応答をクライアントに送り返します。また、correlationIdも設定します。
  • RPCクライアントは応答を待機し、応答を受信すると、correlationIdを使用し応答を要求と照合します
于 2012-09-20T09:26:29.337 に答える