私は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、そのメッセージは落とされます(私はいくつかのサーバーがそれを扱うことができるまでキューに入れておく必要があります)。
あなたのお手伝いをありがとうOlivier。あなたが言ったように、複数のキューに接続できるサーバーであれば、一度に複数のタスクを実際に処理できるという問題があります。単一のキューを使用することによって私が見出す問題は、各タスクが異なることです。 task1のタスクは、task2のタスクとはまったく異なるタスクであり、task1を処理できるサーバだけがそれを処理する必要があります。私はrouting_keysとのやりとりを使ってみましたが、ルーティングキーtask1にバインドされた各サーバーはタスクを処理します(私は一度だけ処理する必要があります)。私は処理を停止する必要はありません。 – marcocamejo
特定のキュー/タスクを処理するサーバが1つだけ必要な場合は、コンシューマを排他的と定義することに興味がありますか? – Olivier
各タスクを処理するサーバーは1つだけ必要ですが、それを処理できるサーバーは多数あります。つまり、tasksAのmessageAは1つのサーバーだけで処理する必要がありますが、3つまたは4つのサーバーがtasks1をlistenしている可能性があります(いずれも選択できます)。 – marcocamejo