分布式系统的现代消息传递
論文?《分布式系統的現代消息傳遞》Modern Messaging for Distributed Sytems
L Magnoni?
通過IOP出版有限公司出版許可物理學學報:會議系列,?608卷,?第1會議
?
作者電子郵件
luca.magnoni@cern.ch
作者隸屬關系
1歐洲核子研究中心,歐洲粒子物理實驗室(CERN),瑞士日內瓦
引文
L Magnoni 2015?J.?物理學:Conf。序列。608?012038
?
抽象
現代軟件應用程序很少孤立存在,而現在通常的做法是依賴服務或使用遠程實體提供的信息。
在這種分布式架構中,集成是關鍵。
十多年來,消息傳遞是解決分布式性質挑戰的參考解決方案,例如網絡不可靠性,
生產者和消費者的強烈耦合以及應用的異質性。
?
由于強大的社區以及對標準和整合的共同努力,消息代理如今已成為許多項目和服務的傳輸層構建塊,
無論是在物理界還是在外面。此外,近年來出現了新一代的消息服務,
重點關注低延遲和高性能用例,突破了消息傳遞應用程序的界限。
本文將介紹分布式應用程序的消息傳遞解決方案,概述主要概念,技術和服務。
1.介紹
本文概述了消息傳遞概念,功能和現代技術。
首先介紹分布式通信和系統集成的消息傳遞。
然后提供對主要消息傳遞功能的回顧,然后概述從代理到無代理系統的消息傳遞的主要技術。
最后,介紹了有關使用消息傳遞解決分布式應用程序通信問題的成功案例列表。
?
2.用于松散耦合通信的消息傳遞
現代分布式系統可以包括數百個(如果不是數千個)應用程序以多層操作,并為彼此提供不同的服務和功能。
在這樣的分布式架構,存在諸如網絡不可靠性,強耦合等諸多挑戰,生產者和消費者以及需要的應用程序的異構性,致力于建立一個堅實可靠的系統。
?
2.1 面向連接的通信
面向連接的通信是在遠程實體之間交換信息的簡單解決方案。如圖1所示,考慮通過面向連接的協議(如TCP / IP)打開套接字,并通過它傳輸原始數據流。這將是一種快速而廉價的信息交換方式,但與此同時,緊密耦合的通信將基于許多假設,這些假設需要滿足才能進行通信:
圖1:緊密耦合的通信。
- 時間依賴:所有組件必須同時可用。
- 位置:每個組件必須知道對方地址。
- 數據結構和表示:在最簡單的實現中,所有組件必須就數據格式和二進制表示達成一致。
?
2.2 用于松散耦合通信的消息傳遞
耦合可以通過各方在溝通時相互作出的假設數來衡量。
消息傳遞是松耦合通信解決方案的一個示例,其中消息是信息構建塊,其目的在于最小化這些假設。
它不是直接向特定地址發送信息,而是發送到可尋址信道,以解決位置依賴性。
為了消除時間依賴性,可以增強該信道以對信息進行排隊,直到遠程組件準備好接收它為止。
這樣,生產者現在可以將請求發送到通道并繼續處理,而不必擔心交付。
消息傳遞不對數據表示做出任何假設,因此標準數據格式(例如,自描述和與JSON或XML無關的平臺)可用于消除在所有組件之間共享數據處理邏輯的需要。
?
2.3消息傳遞方案
典型的消息傳遞用例是:
信息發布:實體發布易變信息而沒有關于誰感興趣的先驗知識(例如傳感器);?
信息存儲:實體從多個來源(例如日志收集器)收集信息;?
遠程過程調用:實體向一個或多個遠程實體發送請求并期望回復。
?
2.4消息傳遞中間件
消息傳遞是一種松散耦合的通信解決方案,可最大限度地減少生產者和消費者的依賴,刪除這些依賴項使整個架構更靈活,更容忍變更,但它帶來了額外的復雜性。
因此,多年來已經開發了專用消息中間件以提供消息傳遞功能而無需處理內部復雜性。
下一節將介紹消息傳遞系統的主要概念和原理。
?
3.消息系統
如圖2所示,消息傳遞系統充當想要通信的實體之間的間接層。
通常稱為消息代理,它負責將數據作為消息從一個應用程序傳輸到另一個應用程序,
這樣生產者和消費者就可以專注于分享內容,而不是如何分享內容。
與許多其他技術一樣,消息傳遞基于一些基本概念和屬性,這些概念和屬性在所有不同的風格和實現之間共享。
圖2:松散耦合通信的消息傳遞。
?
3.1 信息
消息是信息構建塊。它由一個主體組成,它是不可變的,包含通信的結構化數據(例如JSON,XML,序列化協議)對象,以及一組頭,通常是可由代理處理并用于路由的鍵值對。
?
3.2 通信模型:主題和隊列
消息傳遞系統支持不同的通信模型,每個模型定義了生產者和消費者之間如何交換信息。
最常見的通信模型是隊列和主題。
隊列用于實現點對點通信,其中,如果在生成信息時不存在消費者,則消息將保留在通道中以供以后傳遞,
如果有多個消費者,則消息僅傳送一次。
主題是針對經典發布/訂閱方案,
如果不存在消費者,則消息被丟棄,并且在多個消費者的情況下,消息系統將消息傳遞給每個消費者。
來自隊列和主題的部分被廣泛支持,更復雜的傳遞語義存在于協議級別(例如來自AMQP的交換/節點)以及許多其他中間件特定的。
?
3.3 協議
多年來,缺乏與消息代理交互的獨特標準方式已成為消息傳遞技術的已知問題。
AMQP協議由主要的消息傳遞參與者,公司和軟件生產者設計,以克服這一限制。
然而,定義有線通信和傳遞語義的統一協議的內部復雜性要求消息傳遞系統的主要開發工作變得完全兼容。
本節概述了主消息系統當前支持的最常見的標準協議。
對于面向消息的體系結構,協議選擇是一個關鍵的設計決策,就其在應用程序中的強耦合而言。
?
3.3.1 AMQP(高級消息隊列協議)[1]是標準化工作的結果消息傳遞領域的主要貢獻者(例如思科,微軟,紅帽,銀行)。
它是旨在實現不同消息傳遞系統之間的互操作性。?
它提供了定義二進制線協議和完整的傳遞語義,理論上允許AMQP消息傳遞客戶端能夠與不同的代理實現無縫交互符合AMQP標準。?
如今,該協議的最新穩定版本(1.1)的奉獻是尚未廣泛,但鑒于它已經得到了主要消息代理的支持,預計未來幾年將更廣泛地實施。
?
3.3.2 STOMP(流式文本定向消息傳遞協議)[2]是基于文本的協議意味著簡單且可廣泛互操作。?
它主要是一種有線協議,它非常有用基本的消息傳遞語義內置(例如,不支持通信模型,目的地是只是一個字符串消息頭),
需要在消息系統級別進行適當的配置(例如,目的地必須適當地映射到隊列或主題)。 多虧了它簡單,有許多語言提供的廣泛的客戶端,它是由支持大多數經紀人。
?
3.3.3 MQTT(Message Queue遙測傳輸)[3]是輕量級協議設計的最初來自IBM。?
它適用于低帶寬,高延遲的網絡。?
它定義了一個緊湊的二進制格式,通信開銷非常有限,幾十字節,這使得它適用于簡單的物聯網風格應用(例如移動電話,傳感器)生產 - 忘記的情景。
?
3.4功能
如第2節所述,消息傳遞系統可以被視為中間通道通過排隊等附加功能進行增強,以改善通信遠程實體的經驗。
多年來,雖然沒有正式的協議,但不同消息傳遞系統融合在一組共同的功能上,這些功能已成為事實上的標準用于消息傳遞中間件。
功能列表包括Persistence,即保存功能永久存儲上的消息,例如文件系統或數據庫;故障轉移,允許客戶端經紀人失敗時自動重新連接;
保證交付,定義政策用于消息傳遞(例如,至少一次或完全一次);
訂購,發送消息它們的生產順序;
交易,將多個請求視為一部分的能力分布式事務,具有回滾選項和聚類,這是創建的可能性消息代理網絡,用于高可用性和負載平衡。
盡管如此,每個消息系統可以為相同的功能提供不同的解釋。許多其他獨特的經紀人特定存在功能,但它們的使用意味著將應用程序與特定代理硬連接味道。
?
4.消息傳遞技術
面向消息的中間件已經發展了十多年,現在已經成為一個豐富而穩固的服務和庫生態系統。
消息代理作為為分布式應用程序提供消息傳遞功能的中間獨立服務,是最常見的消息傳遞系統類型。
多年來,消息代理已廣泛用于在分布式系統中實現通信和集成[4],但數據密集型和高性能用例除外,
中間實體的存在不適合的選擇。
近年來,出現了新一代消息傳遞系統,重點關注低延遲和高性能用例,突破了消息傳遞應用程序的界限。
下一節將介紹主要消息傳遞技術的概述。
?
4.1 消息代理
消息代理是消息系統最常見的實現。
消息代理是獨立的中間實體,它通過標準或自定義協議提供消息傳遞功能。
存在許多消息代理,不同的功能,協議,實現語言,平臺支持。
本評論的重點是開源解決方案,但許多也作為企業商業軟件的一部分存在。
消息代理是功能最豐富的消息傳遞系統類型,具有協議支持的功能,如第2節所述。
經紀人可以是多語言,允許生產者和消費者使用不同的協議(例如AMQP上的發送者,STOMP上的接收者)
并且它們可以支持消息轉換(例如,將消息有效負載從XML轉換為JSON)以進一步解耦應用程序。
?
4.1.1 ActiveMQ是最廣泛采用的開源消息代理之一。
它是一個Apache項目,用Java編寫,得到了Red Hat的商業支持。
ActiveMQ具有廣泛的協議支持(例如AMQP,STOMP,MQTT,Openwire,HTTP和許多其他),
它提供了許多跨語言客戶端,并且完全符合JMS標準。
ActiveMQ提供了許多高級功能,例如:豐富的語義傳遞(例如虛擬隊列,復合目標,通配符),
JDBC消息存儲(例如,用于在任何JDBC兼容數據庫中保留消息)和高級群集配置(例如,主從,經紀人網絡)。
ActiveMQ是一種功能完備的消息傳遞解決方案,可用于實現許多通信和集成模式[4]。
?
4.1.2 RabbitMQ? 是一個用Erlang編寫的輕量級開源消息代理,它從下面語言的消息傳遞功能中獲益。
RabbitMQ架構是深度模塊化的,它主要支持AMQP和STOMP,但是附加協議可以作為插件加載(例如MQTT,HTTP)。
它支持主要的消息傳遞功能,例如持久性,群集,高可用性和聯合。
RabbitMQ仍然是一種輕量級的消息傳遞解決方案,由于其簡單性和可靠性,可以嵌入到多個項目(例如Logstash)中。
?
4.1.3性能和可伸縮性 對于消息傳遞系統,沒有詳細的上下文化,每秒消息的量化度量(msg / s)幾乎沒有意義。
使用的協議(例如二進制或文本)起著重要作用,但存在許多其他延遲因素:
持久性消息可以慢幾個數量級,放大因子(例如主題消費者的數量)可以通過多個內存中的消息副本影響系統,
對于有效載荷大小也是如此。次優的客戶端可能導致大量的開/關連接,行為不端的消費者可能導致低用戶問題,
消息傳遞基礎結構最常見的問題之一。
?
[5]中的比較,其中幾個消息代理通過STOMP協議在幾個通信模型中進行評估,顯示了在實際情況下如何
性能可能在100000 msg / s和1000 msg / s之間變化。
?
4.2 Apache Kafka
Apache Kafka是一個最初來自LinkedIn的開源項目,現在是Apache基金會的一部分。
它已經被開發用于實時活動流分析,以解決對從生產者向許多潛在消費者移動大量數據(例如,用戶指標,計算機農場監控)的有效方式的需求。
規模和數據大小(數十億條消息和每天數百千兆字節)和時間限制使得用例不適合標準經紀人,如[6]中的比較。
?
Kafka的創新理念是成為無國籍經紀人,因此不保留任何有關消費者的信息。
消費者必須保留其自己的狀態(例如關于最后讀取的數據的信息)并在需要時向Kafka輪詢新數據。
這允許Kafka獨立于消費者的數量來保留單個消息副本(例如,消費時不會刪除消息,而是通過保留期或其他策略刪除消息),
從而實現讀取和寫入操作的高吞吐量。
Kafka持久性是作為分布式提交日志實現的,如圖3所示,設計為易于擴展的分布式系統(基于Zookeeper),允許自動平衡消費者/生產者/代理。
(a)Kafka集群
(b)Kafka主題分區
圖3:Kafka架構。
與標準消息代理相比,Kafka提供有限的消息傳遞功能(例如主要是主題語義,文件系統作為唯一持久存儲,嚴格保證排序)。
盡管有許多客戶端庫可用,但它僅支持TCP上的自定義二進制格式。
Kafka是數據移動的最佳解決方案,經常被用作不同處理系統(例如Hadoop,Storm)的管道。
?
4.3 ZeroMQ
盡管名稱如此,ZeroMQ(也稱為0MQ或ZMQ)[7]不是標準的消息代理,而是一個提供消息傳遞功能的輕量級消息傳遞庫。
分布式應用程序可以使用ZeroMQ進行高吞吐量和低延遲通信,
利用其在生產者和消費者之間實現直接聯系的能力,
沒有涉及中間實體。雖然這可能與消息傳遞的主要假設之一相矛盾,
ZeroMQ通過創新方法實現松耦合通信,充當網絡堆棧的新層。
它使用類似的API擴展了socket的概念,但內置了消息傳遞模式:
請求/回復,發布/訂閱,流水線和獨占對,如圖4所示。
(a)請求/回復
(b)發布/訂閱
圖4:ZeroMQ套接字的示例。
?
與經典套接字相比,每個ZeroMQ套接字都帶有一個內部隊列,以允許異步通信。
結果是,例如在用于點對點通信的請求/回復場景中,
如果在消費者未運行時生成數據,
ZeroMQ庫將負責延遲交付,而生產者方無需額外負載。
?
ZeroMQ背后的理念是強大的,它允許高性能和低延遲的通信,但在應用程序級別具有額外的復雜性。
ZeroMQ主要支持自己的二進制協議,并提供有限的消息傳遞功能(例如,故障轉移,1-N拓撲的多播支持)。
雖然可以使用ZMQ API輕松實現多個功能(例如確認),
實現高級消息傳遞功能(例如保證傳遞,持久性)可能需要相當大的努力,
使其適用于需要簡單消息語義的數據廣告場景。
?
5.用例
本節介紹了幾種成功采用基于消息傳遞通信的用例,以解決分布式系統中的交換信息問題。
5.1 CERN Beam Control中間件
CERN實驗室的光束控制部門正在為大型強子對撞機(LHC)的高可靠性控制/監控/報警應用使用信息。
自2005年以來,一組ActiveMQ經紀人,在商店和正向配置中,
用于收集安全系統生成的關鍵數據(例如30個生產者,2MB / s,4.5K msg / s)并將其轉發給許多消費者(例如監控工具,儀表板)。
作為安全數據關鍵任務,存儲和轉發配置允許將數據生成與消耗完全分離,防止行為不端的客戶端進行數據收集和歸檔[8]。
此外,LHC Control框架最近已從CORBA遷移到ZeroMQ作為通信層[9]。
?
5.2 DAQ在線監測
消息傳遞還廣泛用于數據采集(DAQ)系統的幾個監控工具,
負責從檢測器(例如高能物理實驗)過濾和收集數據到存儲設施。
?
5.2.1 ATLAS TDAQ移位器助手項目[10]依靠消息傳遞將業務警報從私有TDAQ網絡分發到GPN到許多異構消費者。
ActiveMQ群集用于主/從配置,以最大限度地減少對單個出站連接所需的防火墻配置的影響。
?
5.2.2 STAR Online框架依賴于基于AMQP的系統,可靈活,松散地耦合檢測器元數據,
使用消息傳遞作為統一傳輸層進行處理,
存儲和監控。 此外,已經進行了調查以重新編寫MQTT上的控制框架,從協議的靈活性和互操作性中獲益[11]。
?
5.3 WLCG消息服務
消息傳遞也已成功用于大規模地理分布式基礎設施。
WLCG(全球LHC計算網格)消息服務是用于監控全球WLCG站點和服務的骨干傳輸層,
擁有超過50000個客戶端,平均消息速率為100 KHz。 監視基礎結構基于具有JSON有效負載的STOMP。
由于STOMP協議在多種代理風格中的互操作性,
異構消息代理群集(ActiveMQ,Apollo或RabbitMQ)用于客戶端應用程序生成任何內容并消費給所有人[12]的場景。
?
6.總結
消息傳遞從根本上說是對分布式系統問題的實用反應[4]。
如第2節所述,它允許松散耦合的通信作為生產者和消費者之間的中間層。
它為分布式應用程序的靈活性和可伸縮性帶來了許多好處,并對應用程序和基礎架構的復
消息系統仍然是不斷發展的技術,如第3節所示,AMQP標準化工作指向了良好的方向,
但仍然部分采用。
消息代理是在許多項目和服務中用作傳輸層構建塊的可靠且可靠的技術,
無論是在物理界還是在外面。近年來,
新一代系統正在推動低延遲/高吞吐量/數據密集型通信的消息傳遞,
如第5節所述,縮小用例和放松假設,但將消息傳遞應用程序的界限推向新的領域。
?
參考
[1] AMQP(高級消息隊列協議)http://www.amqp.org
[2] STOMP(簡單文本導向消息傳遞協議)http://stomp.gith?ub.io [3] MQTT(MQ遙測傳輸)http://mqtt.org
[4] G Hohpe和B Woolf 2003?企業集成模式?Addison-Wesley Professional [5] Chirino H?STOMP基準http://hiramchirino.com/stomp-benchmark
[6] Kreps J,Narkhede N和Rao J?Kafka:用于日志處理的分布式消息系統。NetDB研討會(雅典,希臘)
[7] Hintjens P?ZeroMQ:指南http://zeromq.org
[8] Ehm F?為CERN的控制系統運行可靠的消息傳遞基礎設施。?ICALEPCS2011會議錄(法國格勒諾布爾)
[9] Dworak A,Ehm F,Sliwinski W和Sobczak M 2011?中間件趨勢和市場領導者2011。
ICALEPCS2011會議錄(法國格勒諾布爾)
[10] Kazarov A,Miotto GL和Magnoni L 2012?AAL項目:ATLAS數據采集基礎設施的自動監測和智能分析。物理學雜志:會議系列,第368卷
[11] Arkhipkin D,Lauret J和Betts W 2011?STARs在線監控和元數據收集的消息排隊框架。物理學雜志:會議系列,第331卷
[12] Cons L和Paladin M 2011?WLCG消息服務及其未來。物理學雜志:會議系列,第396卷
總結
以上是生活随笔為你收集整理的分布式系统的现代消息传递的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 适配器模式(Adapter模式)
- 下一篇: 基于java 网页的宠物店管理系统