2016-03-28 9 views
1

一般的なメッセージキューイングシステム(RabbitMQ、ActiveMQなど)のドキュメントを読むと、ロードバランシングは常にキューイングシステム(ラウンドロビン)または複数のキューを使用するプロデューサメッセージの属性。しかし、我々のアプリケーションでは、消費者でなくても誰も、メッセージを処理するのにどれくらいの時間がかかるかを知っています。数ミリ秒から数時間の間で設定できます(基本的に任意の入力xに対して任意の関数fを計算しています)。したがって、ロード・バランシングは、「ロード」がしきい値を下回っている(ロードは実行ジョブ数、CPU負荷など)場合にのみメッセージを受け入れるという点でコンシューマによって実行される必要があります。理想的には、プロデューサはメッセージをキューに入れ、メッセージはすべてのコンシューマに「提供」されますが、ただ1人のコンシューマだけがメッセージを受け入れて処理します。第1ラウンドでコンシューマーを受け入れるコンシューマーもなく、1人のコンシューマーがフリーリソースを確保するまでキュー内にとどまることさえあります。 質問があります:一般的なメッセージキューイングシステムで何とか可能ですか、間違った方向に向かっていますか?コンシューマベースのロードバランシングを使用するメッセージキュー

答えて

0

これは、これらのシステムの性質上、まったく実際の追加作業なしで達成できます。 RabbitMQでは、先にフェッチするジョブの数を指定するprefetch sizeを設定できます。これを0に設定すると、各コンシューマは一度に1つのジョブしか持てません。これをメッセージ肯定応答と組み合わせて使用​​したいので、消費者は別のメッセージを提供する前にメッセージを確認する必要があります。

すべてのアイドル状態のコンシューマがジョブの待機を待機し、MQはFIFO順にジョブをスプール・オフします。ジョブの処理が完了すると、そのジョブが実行され、MQによってキュー内の次のジョブが実行されます。コンシューマがアイドルで、ジョブの準備ができていない場合、コンシューマが使用可能になるまで、メッセージがキューに格納されます。

+0

ありがとうございます。私はそれを試してみましょう。 – sithmein

関連する問題