2015-07-22 70 views
0

在Rabbit MQ中是否有與Active MQ虛擬主題相同的功能?或者任何其他機制實現隊列語義。某些主題訂閱者在重新聯機時需要傳遞持久性消息,並且需要負載平衡。兔子MQ虛擬主題?

編輯

有多個消費者,他們幾個都leewway失去消息,因爲它們只在實時基礎上採取行動;很少有人不需要,因爲他們需要歷史數據。

作爲一個簡單的例子,在主應用程序中,只要用戶登錄失敗,就會發布消息。其中一位聽衆每發送一次登錄失敗都會發送一封電子郵件,而另一位則需要在一天發生5次失敗的情況下發送電子郵件。

回答

2

我對ActiveMQ並不是很熟悉,所以這是基於AMQ的文檔示例的一點猜測。

望着這頁(http://activemq.apache.org/what-is-the-difference-between-a-virtual-topic-and-a-composite-destination.html):

虛擬主題和複合Desetination之間的主要區別是,一個複合目標消費目的地列表是靜態的,硬連線。而在運行時使用虛擬主題時,可以動態創建新的使用者或隊列,並將其添加到訂閱中,而無需重新配置代理。

,而這個頁面(http://activemq.apache.org/virtual-destinations.html):

但是如果主題是虛擬的,消費者可以從邏輯主題訂閱物理隊列消耗,這讓很多消費者要在多臺機器上&線程運行負載平衡負載。

從我在這裏讀到的,ActiveMQ中的一個虛擬主題是RabbitMQ路由鍵和隊列綁定已經工作的方式。

您可以讓消息使用者定義一個帶有綁定到交換的隊列,並隨時訂閱該隊列。您也可以創建一個擁有多個消費者的單個隊列。

一個以上的短語,脫穎而出的ActiveMQ:「不必重新配置代理」

隨着RabbitMQ的,你總是在運行時重新配置代理的能力。經紀人沒有單獨的設計時間。 RabbitMQ拓撲的整個佈局是通過生成和使用消息的相同協議定義的。這爲您提供了很大的靈活性,並且可以動態創建綁定和隊列,並根據需要使用它們。當你的消費者完成後,它可以銷燬它創建的隊列。無需重新設計或重新啓動RabbitMQ。

如果您需要RabbitMQ的持久性,您需要考慮幾件事情。堅持消息? (as-in,持久化到磁盤)還是持久化在隊列中保持活動並持有消息?

消息持久性(保存到磁盤)允許消息在RabbitMQ死亡並重新聯機時生存......也就是說,當消息代理自身停止並恢復時。與在內存中保存消息相比,這是一件非常昂貴的事情。有時候,這很重要,而且值得花費。

聽起來您正在談論隊列持久性,儘管......隊列將保持活躍狀態​​,並且即使有零個消費者附加到隊列中也會繼續接收消息。然後,當消費者重新加入隊列時,它將接收隊列中的消息。這是隊列配置的「持久」和「自動刪除」的組合。

當rabbitmq(代理)停機並恢復時,持久隊列將繼續存在。這可能是你想要的。

當沒有更多消費者連接到隊列時,「自動刪除」隊列將自行刪除。如果在沒有消費者的情況下需要隊列生存,請確保將autodelete設置爲false(我認爲這是默認設置,但將其明確設置爲false會很好)。

希望有幫助!

P.S.虛擬主題的「從物理隊列中消費邏輯主題訂閱」的想法聽起來很像「選擇性消費者」模式......這是an anti-pattern in RabbitMQ

+0

感謝您提供非常詳細的答案。我想要保持隊列以及該隊列中未被確認的消息,同時牢記原始源代碼是一個主題。我不認爲這是選擇性消費者的情況。多個應用程序/組件需要偵聽消息,由於它們只能實時操作(因此,舊消息無關緊要),因此很少有消息可以丟失消息。很少有人不需要,因爲他們需要保持/行事歷史記錄。 – saugata

+0

在這種情況下,每個消費者可能會擁有自己的隊列並使用相同的綁定密鑰(路由密鑰)來確保他們獲得所有消息。需要所有消息的消費者將使用一個持久隊列。不需要所有消息歷史的消費者將使用自動刪除隊列。如果您需要這些消息才能在rabbitmq崩潰/恢復過程中生存下來,那麼發送持久性消息就能做到這一點 –