2017-09-07 4 views
3

私はJavaとSpring FrameworkでRabbitMQを使用していますが、プロデューサとコンシューマがあり、両方とも複数のインスタンスが実行されますが、プロデューサに送信される各リクエストは、その消費者は同じプロデューサ(要求を保持しているものとまったく同じもの)に返答することができるはずです。RabbitMQリクエストレスポンスメッセージ

だから要件は次のとおりです。

  • プロデューサーは、HTTPリクエストを受信するには、メッセージを生成し、キューにそれをプッシュします。
  • メッセージの内容は、一度に1つのコンシューマによってのみ処理され、他のコンシューマは同じメッセージを処理する必要がありません。
  • そのメッセージは承認されるのを待つ必要があります。
  • すべてのコンシューマがメッセージを処理できますが、コンシューマに障害が発生したときにメッセージを回復できる必要があるため、メッセージはキューに戻されます。
  • 完了したら、消費者は今すぐ要求を保持しているのと同じプロデューサに返信する必要があります。
  • プロデューサが失敗した場合、そのリクエストも失敗するはずですので、プロデューサがまだ生きていないかどうかを確認してから、使用できない場合は失敗します。

ので:

要求 - > Producer1 - >キュー - > consumer1

- > Producer1

待っている - > - > consumer1が

を失敗しますメッセージをキューに戻す

- > consumer2がメッセージをフェッチしてから1を残します。

- > consumer2が終了し、要求メッセージACKおよび応答

送信 - > consumer2が、それは、現在の故障信号私は考えることができるすべてを

を送信する必要があるので、producer1が失敗したことを発見します 1. Direct Reply Pattern:メッセージには問題がありませんが、コンシューマの障害から回復できる必要があります。 2. The RPC Model:プロデューサのエラーの問題に対処していません

他の解決策はありますか? ?私はこれを間違っているのですか?

+0

あなたの最後のポイントは、rabbitmqがどのように使用されるのかという論理からちょっと離れています。プロデューサーは、誰がメッセージを受け取るのか、誰が欲しいのかを知るべきではありません。誰かがメッセージを受け取ることをプロデューサーが知っている場合は、なぜメッセージブローカーを使用するのが気になるのですか...ただメッセージを送信するクライアントはプロデューサーであり、受け取るサイレントはコンシューマーです。もちろん、1人のクライアントが同時にRPCの例であることもあります。また、そのためにrabbitmqのクライアント障害処理(プロデューサまたはコンシューマ)がないのはなぜですか? – cantSleepNow

+0

@cantSleepNow直接呼び出しを使用する場合は、メッセージブローカが必要です。コンシューマが失敗した場合は回復できません。処理していたジョブと失敗したジョブを確認します。 – engma

+0

これはJavaに関する質問ですが、.NETにはメッセージブローカーとしてRabbitMQで要求/応答を処理する軽量メッセージバスツールMassTransitとNServiceBusがあります。これらの2つのツールは、RabbitMQの上にある抽象レイヤーにあり、要求/応答を容易にし、パターンを公開し、メッセージのシリアライズ/デシリアライズを処理します。私はJavaの等価物があるかどうかわからない。 – Andy

答えて

0

このプロセスを達成するためにはDirect-toを使用する必要があると思われますが、まだわかりません。 解決策が到着したらお知らせします。