2016-09-16 33 views
2

我試圖設計一個實時監控&控制系統是模塊化的,因此它可以爲不同的硬件網絡分配和擴展/重新配置。經紀和非經紀消息系統的優點和缺點

我很快得出結論,我需要某種分佈式企業消息傳遞系統。但是有很多選擇,每個都有優點和缺點,其中一些選項決定了不同的體系結構。我試圖弄清楚我是否需​​要經紀商或無代理系統,是否需要某些系統(例如RabbitMQ)的消息可靠性或像ZeroMQ這樣的系統的輕量級高吞吐量,還是需要「按順序到達」 Kafka的高吞吐量。

首先,這些體系結構是否有意義?


ZeroMQ類型 「Brokerless」 系統:

enter image description here

注:

可以有許多 「A部分」 每個 「B部分」,以及許多「部分B「喂入」C部分「

優點:

  • 高吞吐量,低letancy
  • 容易地集成到組件,輕便部署(無需部署經紀人)。

缺點

  • 消息不能保證傳遞。有些可能會被丟棄。這可能是橙色突出顯示區域中的問題。這對於GUI並不重要,但是如果本地控制模塊正在作出決定,它可能需要需要所有信息。 (想想看,最新的可能就足夠了 - 沒有必要用過時的數據做出決定)。同樣,如果A和B之間的網絡出現故障,歷史記錄將具有不完整的歷史記錄。這有多關鍵?
  • 沒有「發現」。組件之間的關係需要更多的管理。

RabbitMQ的類型代理系統:

enter image description here

優點:

  • 消息保證遞送。
  • 通過經紀人進行管理。

缺點

  • 慢得多,高延遲
  • 更多部署&維持(經紀人/ RabbitMQ的需要安裝的機器,它不只是內置的模塊)

Inbetween opti ons:

我看了卡夫卡。它的代理,所以發現照顧。但是,它看起來比RabbitMQ輕巧得多,雖然它不能保證傳輸(因此速度更快/延遲更低),但它確實維持了RabbitMQ所不具備的順序。它還緩衝消息 - 因此如果有網絡問題可以檢索它們。

寫下來之後,我不確定保證交貨的重要性。如果控制模塊收到消息,如果它是「舊」,則無關緊要。如果這位歷史學家有完整的歷史將會很棒 - 但它至關重要嗎?

在ZeroMQ中實現我自己的「消息緩衝區」可能是一個選項,用於在發生故障時存儲消息的網絡通信。我比RabbitMQ擁有更多的控制權,並且可以在我需要通過更不可靠的(通過網絡)進行消息傳遞時實施它。

顯然,衡量這些優點或缺點是我的工作。我的問題是:還有什麼可以考慮的嗎?這兩個選項的架構是否有意義?

我計劃大多數實現是在C#中,而我目前在消息傳遞系統方面沒有任何經驗。

回答

0

可靠性可能意味着不同的事情。這link from zmq可能是我讀過的最好的之一。但是,下面簡要說明在發生硬件故障時的可靠性

Apache Kafka - 消息傳遞保證意味着不同的事情。見Message Delivery Semantics。值得注意的是"Kafka's semantics are straight-forward. When publishing a message we have a notion of the message being "committed" to the log. Once a published message is committed it will not be lost as long as one broker that replicates the partition to which this message was written remains "alive". "

RabbitMQ也提供了一些選項。閱讀關於Clustering and HA。但我個人認爲,Apache Kafka本質上(按設計)是一個分佈式的,分區的,複製的提交日誌服務,因此以更清晰的方式解決了這個問題。

ZMQ我對zmq知之甚少,無法做出明智的結論。但我認爲zmq並不試圖解決可靠性問題。相反,它是一個embeddable networking library,它爲通過消息相互交互的高性能,可伸縮集羣應用程序提供了基礎。但是,從我所知道的情況來看,它並沒有特別針對可靠地持續存在的消息(作爲經紀人)的問題。 Apache Kafka似乎很好地填補了這個空白 - 性能很好,但提供了實現可靠性的選項。

結論:我認爲可靠性不只是經紀人的責任。相反,這是組成您應用程序的所有部分的集體責任。可靠性,性能和可擴展性只有通過良好的設計和使用正確的技術才能實現。