2012-10-24 78 views
4

我目前正在評估RabbitMQ來管理隊列。我想知道RabbitMQ如何管理內存中的隊列項目。RabbitMQ內存管理和複製

在此發佈商訂戶示例 http://www.rabbitmq.com/tutorials/tutorial-three-python.html rabbitMQ Publisher subscriber

是它爲每個用戶(消費者)創建隊列?例如,如果我有兩個消費者,那麼我加倍使用內存來存儲消息?

我的印象是,如果我在一個隊列上附加多個工作人員,那麼它將成爲一個工作隊列,每個用戶都收到不同的消息。

假設我正在爲此建立聊天服務器。我是否需要爲每個消費者創建一個隊列?內存中的每條消息都會乘以連接的用戶數量?或者內存中只有一條消息,每個隊列都有指向該消息的指針。

也在主題消息的示例中。 http://www.rabbitmq.com/tutorials/tutorial-five-python.html

Topic message

讓說,我有1KB的消息。那麼2隊列中有2kb內存使用情況? Q1,Q2,並說消息匹配所有綁定密鑰。

如果我添加了另一個隊列來聽,比如說說lazy.blue.*爲Q3。那會在內存中創建一個新的隊列項嗎?並複製數據?

回答

0

我不是rabbitmq黑客,但常識說每個隊列應該有一個指向唯一消息實例的指針。

1

在第一個示例中,您有一個發佈者將消息發送到特定交換機,並且該交換機綁定到兩個隊列。

關於爲每個消費者創建一個隊列(我假設這就是您說「訂戶」時的含義),這完全取決於您。在第一個圖中,沒有顯示消費者,但您可以配置消費者在這些隊列中的任一隊列上偵聽消息,或者同時在這兩個隊列中偵聽消息。隊列(不是消費者)會影響你的記憶;就內存成本而言,交換比較便宜。

對於第二個圖,是的,創建第三個隊列「Q3」將在內存中創建一個新的隊列。我對你最後一個問題有點困惑,你似乎在問,如果交易所發送一條符合所有綁定模式的消息,會發生什麼?如果發生這種情況,郵件將只發送給所有三個隊列。主題類型的交換(如示例中的交換所設置)簡單地將消息路由到綁定鍵匹配消息路由鍵的所有隊列。

+0

我不得不修復第一張圖片,我的印象是如果你將多個消費者連接到單個隊列中,消費者會得到不同的數據,因爲我希望每個消費者接收相同的數據,我必須爲每個消費者創建單獨的隊列,這是真的嗎?每個新的消費者都會將存儲在內存中的消息翻倍 我知道消息會被髮送到3隊列,但是我想知道這樣的結果,那1個消息會在內存中重複3次嗎?或者它只會被存儲一次,每個隊列都有一個指向該消息的指針? – ahmy

+0

如果你有多個消費者然後爲一個隊列,他們將分別得到不同的消息。如果你想讓每個消費者都得到相同的我然後你需要一個消費者隊列和一個將消息轉發給每個隊列的交換機。 – robthewolf

+0

我想你可能會誤解mq。理論上,每個隊列會有更多的內存使用量。但重要的是,每條消息都被快速消費。如果隊列中沒有很多消息,Rabbit mq的效果最好。 – robthewolf

3

來源:http://www.rabbitmq.com/blog/2011/01/20/rabbitmq-backing-stores-databases-and-disks/

如果兔子需要節省內存和寫入到磁盤,保存只有一個消息。 「

」隊列本身決定何時以及是否向磁盤寫入消息,但是單條消息可以發送到多個隊列,確保每條消息只寫入磁盤一次顯然是有利的,但是,這裏有不同的信息:首先,消息內容本身。這在消息已發送到的每個隊列中都是相同的,並且只應將其寫入磁盤一次,而不管它發往的隊列數量是多少;請注意,後續寫入操作不需要進行值比較:如果消息的ID爲後備存儲所知,則消息正文將與磁盤上已有的內容匹配 - 消息內容永遠不會被代理更改。第二條信息是每個隊列中消息的存在:隊列中的位置,鄰居的位置以及隊列特定的狀態。第二條信息是允許RabbitMQ啓動,從磁盤恢復消息和隊列,並確保每個隊列中的消息與RabbitMQ關閉時的順序相同。

因此,RabbitMQ的默認後備存儲由一個僅涉及將消息內容寫入磁盤的節點全局消息存儲組成;和每個隊列隊列索引,它使用一種非常不同的格式爲每個隊列數據寫入每個磁盤的數據「