2017-06-09 7 views
8

に結果を処理するために、私はSpringベースのWebアプリケーションで次のユースケースを持っているのRabbitMQ:内のメッセージ:私は、次のひねりと競合消費者EIPを適用する必要がどのタスクにジョブを分割し、

  • キューは、実際には同じジョブに属する分割されたタスクです。したがって、シナリオを「完了」または「失敗」として保存するために、ジョブのすべてのタスクが完了した時点と完了ステータスを正しく追跡し、結果をログに記録して、たとえば次のように通知する必要があります。電子メールのユーザーはそれに応じて

だから、私は上記の要件を考えると、私の質問は:

  1. これはRabbitMQので、どのようにはいた場合に行うことができますか?
+0

この場合、ジョブごとにユニークなIDを割り当て、ジョブに関連するキュー内のすべてのメッセージにこのIDを添付し、各タスクにステータスフラグを「進行中」として配置し、最後に「完了" 「失敗」の意味を定義し、それに応じてルールを実装するだけで済みます – Adonis

+0

@asettouf - 「競合する消費者」パターン(別名「 ワークキュー」)に従うと、https://www.rabbitmq.com/tutorials/tutorial-two- java.htmlでは、ジョブのタスクが並行して実行され、これが必要なものです。だから、これを考慮に入れて私はあなたの提案がどのように働くのかわかりません – kmandalas

+0

ちなみに、誰かの答えがあなたの問題を解決したら、それを大きいチェックボックスを使って答えとして受け入れたいかもしれません。それはStackoverflowの未解決の質問に焦点を維持するのに役立ちます。 – Adonis

答えて

3

私は素早く、gistを作成して、どのように行うことができるかの非常に粗悪な例を示しました。この例では、1つのプロデューサと2つのコンシューマと2つのキューと、コンシューマによって消費されるプロデューサ(「SEND」)のためのものと、その逆のコンシューマとがあり、コンシューマは「RECV」キューにパブリッシュし、 。

この場合のプロデューサは単純に1つのジョブ(0から5までのランダムな量のタスク)を送信し、ジョブが完了するまでブロックするので、これは非常に粗末な例です。これを回避する方法は、ジョブIDとタスク数をマップに保存し、毎回ジョブIDごとに報告されたタスクの数が確認されるようにすることです。

+0

フィードバックに感謝します。私はできるだけ早く評価しようとしますが、受け入れられる有用な答えのようです。 – kmandalas

+0

@kmandalas pom.xmlはかなり簡単ですが、完全なプロジェクトが必要かどうかを教えてください。また、私はできるだけ効率を上げたり改善したりするつもりはないことを覚えておいてください。より具体的に考えてください。 – Adonis

+0

あなたのアイデアは論理的なPoCだと思います。今、私はこのサイトで見つけたものとリンクしようとします:http://blog.zenika。私がSpringと関連するフレームワークを使用しているので、com/2012/03/15/pdf-workers-with-rabbitmq – kmandalas

1

あなたがしようとしていることは、RabbitMQの範囲を超えています。 RabbitMQは、キューに入れることができるメッセージを送受信するためのものです。 あなたの仕事の仕事を追跡することはできません。

「ジョブストレージ」サービスが必要です。消費者がタスクを終了するたびに、Job Storageサービスが更新され、タスクは完了したものとしてマークされます。ジョブ保管サービスは、そのジョブに含まれるタスクの数を認識し、最後のタスクが完了すると、成功したものとしてジョブを完了します。このサービスでは、ジョブを失敗として処理する場合など、他のすべてのビジネスロジックも実装します。

+0

もちろん、サービスを実装する必要があります。しかし、さらに研究を重ねた結果、「ワークキュー」と「リクエスト返信」のパターンを組み合わせることで、もちろんいくつかのサービスでソリューションにアプローチすることができます。例:https://blog.zenika.com/2012/03/15/pdf-workers-with-rabbitmq/ – kmandalas

+0

消費者がメッセージを処理した後に出版社側で何かが起こる必要がある場合、はい消費者は出版社。 –

関連する問題