1

プロジェクトでrabbitmqを使用しますが、開発マシンでデバッグしたいという問題に直面しているため、最初に要求メッセージを送信するマシンに応答メッセージを送信する必要があります。それをどのように達成するのか、spring-rabbitmq フレームワークに既存のソリューションはありますか?

私たちはいくつかの解決策を検討しました。マシンごとに一連のキューを宣言するなど、キュー名のプレフィックスをマシン名で指定します。それは実現可能ですか?

4

1 に答える 1

1

一連のキュー (デバッグ キュー AZ) を定義し、それらをx-match=any, from=[A-Z], to=[A-Z]それぞれ属性を持つヘッダー交換にバインドします。次に、ヘッダー交換をメインの作業交換(1 つ以上) にバインドして、関心のあるすべてのメッセージを受信します。これにより、コンシューマーが応答を発行すると、デバッグ交換に複製され、適切なキューにルーティングされます。

 [sender X]   [     worker      ]                       [consumer on queue X]
     |            ^          |                 
 [request]        |      [response from=X, to=X]      [duped request from=X|                 
      \           |          |                        [duplicated response from=X, to=X]
       \  [request from=X]   |                                 ^
        v         |          V                                 |
      [working topic exchange]           -------> [debug headers exchange]
       /           |         \                   /           |         \
   {bindings by routing key mask}           {bindings by any headers from=[A-Z], to=[A-Z]}
     /             |           \               /             |           \
[working queue 1] ...  [working queue N]   [debug queue A]  ...  [debug queue Z]

リクエストおよびレスポンス メッセージをバインドするにはapplicationId、およびcorrelationIdメッセージ属性を使用できます。

要求メッセージと応答メッセージの両方がデバッグ キューに複製されることに注意してください。x-match=all, from=[A-Z]またはのような特定のヘッダーのみに一致するようにキューをバインドし、x-match=all, to=[A-Z]そのヘッダーのみ (のみfromまたはのみto) で応答メッセージと要求メッセージを発行することにより、要求メッセージと応答メッセージに個別のキューを指定することもできますが、それはあなた次第です。

長所:

  • 実装が簡単
  • 最小限のコード変更が必要
  • オン/オフが簡単
  • 本番環境で安全に実行できます

短所:

  • RabbitMQ 側からより多くのリソースを使用する

または、デバッグ プロセスでリアルタイムの応答受信が必要な場合は、何らかの方法でRPCパターンを利用できます。ただし、これにより、応答が処理されるまでパブリッシャーがブロックされます。これは、実際のアプリの使用とは異なり、ビジネス ロジックが壊れる可能性があります。

長所:

  • 段階的なデバッグ プロセス

短所:

  • 実装が難しい
  • 多くのコード変更が必要になる場合があります
  • ビジネス ロジックを壊す
  • 有効化/無効化が難しい
  • 本番環境は安全ではない

ps: ASCII グラフで申し訳ありません

于 2013-12-27T18:41:17.120 に答える