2011-11-14 85 views
4

我正在研究一個由多個模塊組成的應用程序,並要求它們彼此共享信息。例如:發佈/訂閱其中模塊發佈某些信息(例如狀態變量)以及對特定信息感興趣的模塊獲取它的情況。或請求/回覆情景哪裏感興趣的模塊顯式詢問信息並得到答案。消息總線與組播

我一直在尋找到不同的消息總線實現,即d總線ØMQ的RabbitMQQPID(後兩者都基於AMQP)。然而,有人指出,爲什麼不簡單地使用多播來解決問題,而不是嘗試一些複雜而繁重的消息總線實現。

由於缺乏多播能夠真正解決我的問題並瞭解這兩種解決方案的優缺點的經驗,我懇請專家幫助我解決問題。非常感謝。

+0

你有什麼消息速率,大小,持久性和可靠性要求? –

+0

@ScottA。大約有30個模塊需要共享信息。消息速率並不是非常高。它主要是需要傳遞給其他模塊的狀態信息,例如當狀態發生變化時,或者某個模塊請求狀態變量的值時。在發佈/訂閱方案中,可靠性不是一個大問題,而是在請求/回覆方案中。 –

+0

在共享狀態下保存了多少信息?對於Zookeeper來說,用例是高讀取,低寫入和相當少量的數據。這不是一個消息系統,但可以作爲一個濫用。 –

回答

4

在大量大批量生產環境中有消息總線和組播的經驗,並且與幾位有經驗的網絡工程師討論過這些問題,我可以說你應該避免組播如鼠疫,除非你正在廣播非常多的節點(數百)。

如果你打算使用多播,你必須明白它是一個不可靠的協議。消息可能會丟失,可能會重複,等等。您需要花費大量時間在多播之上獲得可靠性協議(重試,重複檢測,重新發送),以使其有用。關於組播指揮機器人坦克的軍隊測試有一個很好的軼事,我試圖找到一個參考...基本上當你發送「右轉90度,右轉90度,火」到坦克線其中一些人只收到1個右轉信息,其他人收到3個,這是一個混亂的祕方。

根據您需要共享的信息種類,有幾種選擇。

如果他們共享配置信息,請看Zookeeper之類的東西。它的可靠性,重量輕,使用簡單。共享狀態的最新值始終可用並且保持不變。使用消息總線,您仍然需要重新發送協議,以防止模塊由於關閉而丟失最後的配置消息。

對於消息總線,它們可能很複雜。但是,我不會把ZeroMQ放在這個類別中。它可以模擬消息總線,但它更像是點到點機制。我沒有在生產中使用它,但我用它做的研究和原型非常有利。

另一種選擇可能是Oracle Coherence,GridGain,GigaSpaces等分佈式數據網格。再次,這是安裝和維護的另一個應用程序,因此您的複雜性不斷上升,但數據網格有很多用途。

另一個MQ選項是HornetMQ。我沒有使用它(我們在內部使用兩個商用MQ,包括Sonic和MQ Series),但我看到了一些有利的比較。

D-Bus似乎針對單臺機器上的通信進行了優化,常見問題解答建議您在其他地方查看是否正在進行點對點,集羣或其他類似的事情。警告:我從來沒有使用過D-Bus,所以我基本上反思了我剛纔閱讀的信息。

+0

非常感謝您的回覆。它主要是模塊必須共享的狀態信息。我一定會看看Zookeeper。不幸的是,您提到的其他解決方案不能被視爲軟件大小的問題,因爲它必須在有限的內存和CPU資源的硬件上運行。 –

+0

@JahanzebFarooq Zookeeper可能與HornetMQ類似。再次,這取決於你周圍的交易。國家信息聽起來像是一個Zookeeper使用案例。如果您正在尋找輕量級的東西,ZeroMQ也是一個不錯的選擇,但它需要您在頂部添加重發協議。需要多少臺機器進行通信? –

+0

在典型的情況下,它全部在同一主機上。但在更高級的情況下,某些模塊需要在不同的主機之間進行通信,主機的數量可能在10到50之間。 –

1

您是否擔心數據包/郵件丟失或丟失?消息總線可以處理或緩解這些問題,而多播不會默認。

+2

這似乎應該是一個評論。在回答問題之前,通過評論收集您需要的任何澄清。 –