2017-06-29 58 views
1

我有兩個節點上運行的rabbitMQ代理作爲集羣。我觀察到,如果已創建隊列的節點發生故障,則其他節點上的隊列將不可用。如果我嘗試從其他節點發布消息,則失敗。即使我從集羣中刪除失敗的節點(使用忘記集羣命令)並嘗試從其他節點發布消息,行爲也是一樣的。沒有消息複製的Rabbitmq高可用性隊列

我不想啓用隊列的鏡像,原因很簡單,它會複製消息,這將成爲網絡間的額外負載。

rabbitMQ有辦法實現這個嗎?

回答

0

您正在遇到的行爲是rabbitmq的默認行爲及其恰好是我應該發生的事情。您創建隊列的節點現在成爲生產者,如果此節點發生故障,則任何可用的連接或隊列或與之相關的交流根本不起作用。有兩種方法可以解決這個問題。

  • 一種選擇是,沒有爲每個節點和想聽從一個特定節點接收消息可以訂閱特定隊列的交換節點的任何一個單獨的隊列。這似乎不是一個好主意,因爲你需要爲它管理很多事情。

  • 第二種選擇是在發佈之前總是聲明一個隊列,所以如果你的隊列不可用,那麼新的隊列將取代它的位置,並且所有節點訂閱都能夠監聽並且任何生產者節點都能夠發佈該隊列。該選項將解決節點關閉或節點不可用的問題。從docs

發送之前,我們需要確保收件人隊列存在。如果我們發送消息到不存在的位置,RabbitMQ將只刪除該消息。讓我們創建該消息將被傳遞一個hello隊列:

0

RabbitMQ的,您可以導入和導出定義。定義是包含所有代理對象(隊列,交換,綁定,用戶,虛擬主機,權限和參數)的json文件。它們不包含隊列消息。

您可以導出擁有該隊列的節點的定義,並定期將它們導入羣集的從屬節點。您必須爲此任務啓用管理插件。

更多的信息在這裏:https://www.rabbitmq.com/management.html#configuration