2011-11-16 47 views
3

假設您有一個包含3個節點的小型rabbitmq系統,應該可以在同一個交換中處理100個以上的高容量隊列。鑑於隊列只存在於創建它們的節點上(我們沒有使用複製的高可用性隊列),創建隊列的最佳方式是什麼?將隊列分佈在羣集節點中有什麼好處,還是將它們全部保留在一個節點上並讓rmq執行路由更好?應該如何分佈在RabbitMQ集羣中的隊列?

+0

」由於隊列只存在於創建它們的節點上,「 –

+0

- 在HA羣集中,它們被複制到每個節點,不是? (對不起,上面一半提交的評論然後分散注意力!) –

+0

嘿史蒂夫,對不起,我不清楚。我們目前沒有使用高可用性隊列,因爲直到後來的rmq版本才推出它們。將更新問題更具體。 –

回答

3

這取決於你的應用程序,真的。

RabbitMQ的是聰明發送消息,所以當集羣中

  1. 保存該消息駐留在節點或
  2. 上,如果消費者有一個隊列,系統只會將消息發送到節點連接到該節點並請求該消息。

通常,您應該旨在在該隊列的發佈者和使用者將連接到的節點上聲明隊列。換句話說,您應該旨在將發佈者和使用者連接到擁有所使用隊列的節點。這假定您正在嘗試節省整體使用的帶寬。

如果您使用集羣來提高吞吐量(您可能是),並且您不關心內部使用的帶寬,您應該旨在以平衡的方式將發佈者/消費者連接到節點,而不用擔心關於內部路由機制。

要考慮的最後一件事是內存和磁盤空間。隊列將消息存儲在主內存中,如果不足,則將其退回到磁盤。因此,如果您將所有隊列聲明在一個地方,則會導致一個「過度工作」的節點和兩個內存空閒的節點。

+0

感謝您的意見,scvalex。我喜歡在發佈者和訂閱者都將連接到的節點上創建隊列的想法。然而,我們實現起來有點困難,因爲我們有一個可變的隊列隊列,並且不得不通過發佈者和訂閱者都知道的某種可散列算法將隊列分配給一個節點。 –

+0

很好的答案。您能否引用一些關於權衡*吞吐量和內部帶寬的資源*以及過度使用一個節點*? – sumid

2

作爲在我正在開發的應用程序中實現冗餘和故障轉移的一部分,我剛剛完成了在代理之後設置RabbitMQ集羣,並讓我的所有發佈者和消費者通過代理進行連接來自客戶端的各個節點之間的連接。在將RabbitMQ升級到2.7.1之前,這似乎將隊列非常均勻地分配給單獨的節點,但這當然很大程度上取決於代理如何平衡請求以及客戶端何時嘗試連接(並聲明隊列)。儘管如此,我剛剛升級到RabbitMQ 2.7.1,這非常痛苦,給了我們高可用性隊列,這對我們的應用來說是一個非常大的勝利。無論如何,如果您對設置感興趣,並認爲這對您的隊列問題會有好處,我很樂意分享這個設置。 「

+0

我很想聽聽你的設置。 –

+0

我正在寫一篇博客文章來描述設置,但它不斷推遲,以支持其他需要淹沒的火災,哈哈。雖然我沒有忘記,但很快會再次更新。 – jrob

+0

我很想聽聽你的設置:) –