2017-05-22 15 views
0

私はRabbitMQを使用して、長期にわたるタスクを実行する複数のサーバーを管理しています。各サーバーは1つ以上のキューを聴くことができますが、各サーバーは一度に1つのタスクしか処理しません。RabbitMQ:一度に複数のキュー/ 1つの(長い)タスク

サーバーでコンシューマを起動するたびに、channel.basic_qos(prefetch_count=1)を設定して、それぞれのキューに対して1つのタスクしか処理されないようにします。

- 2つのキュー:task1、task2。 - 2台のサーバー:server1、server2。 - 両方のサーバーは、タスク1とタスク2を持つを処理します。次のメッセージが同時に作成される場合

は:tasks2 ためmessageB - - - tasks1 ためmessageA tasks1

ためmessageC私は何を期待: - messageAは、サーバー1 によって処理されます - messageBが処理されますby server2 メッセージCは、いずれかのサーバーが準備完了(現在のタスクを終了)するまで、キューに入れられたままです。私は実際に何を得る

: - messageAはworker1 によって処理されます - messageBはworker2 によって処理されます - messageCがworker2(WRONG)私は、同時に消費者を起動していない

によって処理されます。実際には、各サーバーで作業タスクが常にオン/オフされています。ほとんどの時間サーバーは、さまざまなキュー(server1:tasks1、tasks2、task3; server2:tasks1、tasks5; server3:tasks2、tasks5など)で動作します。

私はこれをどうすればできますか?オリヴィエの答えに基づいて

EDIT : タスクが異なっています。各サーバーは、それらのすべてではなく、いくつかのタスクを処理することができます。サーバーは一度に1つのタスクしか処理できません。

私はrouting_keysとのやりとりを使ってみましたが、2つの問題が見つかりました:ルーティングキーtask_iにバインドされたすべてのサーバーがタスクを処理します(1回だけ処理する必要があります) task_i、そのメッセージは落とされます(私はいくつかのサーバーがそれを扱うことができるまでキューに入れておく必要があります)。

答えて

0

あなたの説明は、サーバが複数のキューに同時に接続していることが原因であると考えられます。

プリフェッチカウントが1に設定されているため、3つのキューに接続されたサーバーは、処理の説明ごとに1つずつしか処理しなくても、最大3つのメッセージを消費します。

それは、複数のキューのかあなたはすべてのタスクが単一のキューで終わることができたかどうかの必要があるかどうか、あなたの質問から明らかではありません。

  • すべてのサーバーがすべてのタスク
  • が行う消費しません特定のタスクの処理を停止する必要がある場合

特定のタスクの処理を「停止」したり、サーバー全体の処理の分散を制御する必要がある場合は、サーバーのコンシューマーを管理して一度に1つのアクティブなコンシューマしか持っていない(そうしないと、プリフェッチ1のためにいくつかのメッセージをブロック/消費することになります)。

さまざまなタスクの処理を制御する必要がない場合は、すべてのメッセージが単一のキューにまとめられ、単一のコンシューマがそのキューの設定になり、各サーバーに対してプリフェッチが1つ。

+0

あなたのお手伝いをありがとうOlivier。あなたが言ったように、複数のキューに接続できるサーバーであれば、一度に複数のタスクを実際に処理できるという問題があります。単一のキューを使用することによって私が見出す問題は、各タスクが異なることです。 task1のタスクは、task2のタスクとはまったく異なるタスクであり、task1を処理できるサーバだけがそれを処理する必要があります。私はrouting_keysとのやりとりを使ってみましたが、ルーティングキーtask1にバインドされた各サーバーはタスクを処理します(私は一度だけ処理する必要があります)。私は処理を停止する必要はありません。 – marcocamejo

+0

特定のキュー/タスクを処理するサーバが1つだけ必要な場合は、コンシューマを排他的と定義することに興味がありますか? – Olivier

+0

各タスクを処理するサーバーは1つだけ必要ですが、それを処理できるサーバーは多数あります。つまり、tasksAのmessageAは1つのサーバーだけで処理する必要がありますが、3つまたは4つのサーバーがtasks1をlistenしている可能性があります(いずれも選択できます)。 – marcocamejo

関連する問題