2015-08-26 144 views
1

我正在使用Python,RabbitMQ和Pika。RabbitMQ - 消耗多個隊列

我有多個消費者和隊列。我想讓一個消費者從每個隊列中獲取消息。 假設我有2個消費者和3個隊列。我希望我的每一個消費者的閱讀從隊列號碼1,2和3

的消息我已經管理與basic_get這樣做:

basic_get(隊列1)

basic_get(隊列2)

basic_get(queue3)

=>從隊列1中獲取一條消息,其中一條來自隊列2,另一條來自隊列3,然後重複。

「問題」是我想使用basic_consume來設置qos(讓隊列每次推送n條消息)。我想從隊列1中獲得n條消息,然後從隊列2獲得n條消息,從隊列3獲得n條消息,然後返回到隊列1,依此類推。我不想消耗全部從隊列1,然後全部從第二,...

我還沒有找到一種方法來實現多個隊列的basic_consume。在我的情況下可以實現basic_consume嗎?

另外,當使用basic_consume時,我需要線程嗎?它在RabbitMQ中發送消息時會調用函數。但據我所知,這是一位聽衆。所以我在聽的時候什麼也做不了。使用線程有助於在收聽新消息的同時處理任務,對嗎?

謝謝。

+0

請注意,跨線程共享Pika連接不是線程安全的 - 每個線程都必須有自己的連接:http://pika.readthedocs.io/en/latest/faq.html –

回答

0

設置prefetch for the consumer,你應該能夠做到這一點。

我不知道關於鼠害的代碼明確,但該文檔中的例子顯示這樣的:

channel.basicQos(10); // Per consumer limit 
channel.basicConsume("my-queue", false, consumer); 

關於線程......這就要看你的具體應用需求。通常情況下,增加流程實例數量而不是使用線程更容易。但使用線程無疑是在單個進程中並行處理消息的有效方法。