天天看點

淺議消息中間件技術标準與開源實作JMS AMQP 總結

        使用消息中間件是企業應用中降低子產品間耦合的重要方式,開源和商用的消息中間件産品也很多,這些産品都遵循一種或多種消息中間件技術标準。在消息中間件領域有兩類技術标準:

1、面向接口的消息服務标準:這類标準規定了消息服務的接口,但沒有規定采用何種方式實作,可以開發新的應用層協定或者直接在TCP上進行套接字程式設計實作這些接口。面向接口消息服務使用最廣泛的是JMS标準,多個廠商提供了JMS的實作,JMS比較重要的開源實作包括Apache ActiveMQ和OpenJMS等。

2、面向協定的消息服務标準:這類标準定義了新的應用層協定,從協定的行為,消息格式方面展現消息服務的各項功能,但是沒有定義消息服務的程式設計接口。這類标準較多,包括AMQP和Openwire,AMQP較為流行,其主流實作有RabbitMQ和OpenAMQ。

        下面主要關注兩種主流的消息服務标準,JMS和AMQP。綜上所述,JMS和AMQP并不是同一層次上的概念,JMS是消息服務的接口标準,沒有規定采用何種應用層協定實作;而AMQP是協定級别的消息标準,而沒有規定消息服務接口。因而AMQP的互操作性較好,而JMS則更使用更為簡單。目前主流的AMQP實作是RabbitMQ,并且Spring AMQP也有替換之前Spring JMS的趨勢。

        既然JMS和AMQP不是一個層次上的标準,這就意味着某種消息服務的實作可以既符合JMS标準,也符合AMQP協定,即采用AMQP協定實作JMS接口标準。同時滿足這兩種标準的實作是Apache Qpid。Apache ActiveMQ是JMS的實作,底層實作了OpenWire标準,從5.8版本開始相容AMQP協定。

JMS

        Java關于消息服務的标準是JMS,實作JMS标準的軟體可以作為Java下的消息中間件伺服器。jms即Java消息服務(Java Message Service)應用程式接口是一個Java平台中關于面向消息中間件(MOM)的API,用于在兩個應用程式之間,或分布式系統中發送消息,進行異步通信。Java消息服務是一個與具體平台無關的API,類似于JDBC,需要不同的提供商進行各自的實作。

        JMS消息類型包括點對點消息和釋出訂閱消息:

1、點對點消息:這種消息隊列可以同時有多個發送者,每個發送着都可以自由的向隊列中發送消息,被發送的消息按照先發先進的原則一次排列在隊列中,先發的消息排列在隊列的前面排列在隊列中的消息可以立即被使用者使用,也可以等一段時間才被使用者使用!通常有隊列伺服器維持消息的持久化。預設情況按照在隊列中次序一次使用,一旦一個消息被使用,該消息就會被從隊列中删除,此後下一個消息才會被使用。

2、釋出-訂閱消息:所有發送着可以自由的向隊列中發送消息,先發先進的原則排列,這種消息隊列會把目前隊列中的消息一次廣播給目前隊列的所有使用者,一個消息可以被多個使用者接受并使用,預設情況下,如果目前隊列沒有使用者,則隊列中消息也自動被丢失,但是有些伺服器可以修改配置改變隊列的預設行為,使隊列在沒有使用者時,所有的消息被保留,直到有使用者來消費隊列中的消息。

        JMS消息隊列操作模式包括同步消息擷取和異步消息擷取。

        JMS的開源實作主要有下面五種

Apache ActiveMQ

        Apache ActiveMQ是JMS1.1标準的實作,底層的應用層消息協定使用的并不是AMQP,而是OpenWire協定。但是從5.8版本開始也相容AMQP協定。目前的版本是5.8

        Apache ActiveMQ遵從Apache 2.0開源協定,比較成熟,其特點包括:

1、純Java編寫,具備跨平台特性;

2、支援嵌入Spring架構;

3、在衆多JavaEE 1.4伺服器中工作良好,如TomEE、Geronimo、JBoss、Glassfish和Weblogic;

4、支援高性能的JDBC持久化機制;

5、支援Rest API、Ajax Web Stream、CXF和Axis。

6、支援叢集;

7、支援的用戶端開發語言包括C、C++、C#、Delphi、Erlang、Adobe Flash、Haskell、Java、JavaScript、Perl、PHP、Pike、Python和Ruby;

8、支援的消息服務協定包括OpenWire、REST、STOMP、WS-Notification、XMPP以及AMQP。

9、支援廣泛的傳輸協定,例如in-vm、TCP、UDP、SSL、NIO、多點傳播、JGroups和JXTA。

        更詳細的特性清單參考http://activemq.apache.org/features.html。

Jboss HornetQ

        HornetQ是一個支援叢集和多種協定,可嵌入、高性能的異步消息系統。HornetQ完全支援JMS,HornetQ不但支援JMS1.1 API同時也定義屬于自己的消息API,這可以最大限度的提升HornetQ的性能和靈活性。在不久的将來更多的協定将被HornetQ支援。目前最新版本為2.3.0。

        HornetQ的主要特性包括如下方面:

1、支援叢集,包括負載均衡和故障自動轉移;

2、能夠支援龐大的TB級别消息量;

3、高性能,單機處理速度高;

4、使用方面,API簡單;

5、完全使用POJO,純POJO的設計讓HornetQ可以盡可能少的依賴第三方的包。

6、可以獨立運作,也可以無縫整合進Jboss應用伺服器5.0及以上版本(預設自帶);

7、支援TCP、SSL、Http、Servlet和虛拟機内部傳輸;

8、用戶端流控機制,非阻塞消息傳輸和用戶端負載均衡支援;

9、支援web socket和Rest API。

        更詳細的特性清單參考https://community.jboss.org/wiki/HornetQFeatures。

OpenJMS

        OpenJMS是一個開源的JMS 1.1标準的實作,托管于sourceforge,目前最新版本為0.7.7版,版本号過低,還不是很成熟。

        OpenJMS特點主要包括既支援點到點(point-to-point)(PTP)模型和釋出/訂閱(Pub/Sub)模型。支援同步與異步消息發送。JDBC持久性管理使用資料庫表來存儲消息 可視化管理界面。Applet支援。能夠與Jakarta Tomcat這樣的Servlet容器結合。支援RMI, TCP, HTTP 與SSL協定。用戶端驗證、提供可靠消息傳輸、事務和消息過濾。

Open Message Queue

        Open Message Queue(Open MQ)是Sun Java System Message Queue的一個開源版本。Open message queue是一個企業級,可更新,非常成熟的消息伺服器。它為面向消息的系統內建提供一套完整的JMS(Java Message Service )實作。由于Sun公司被Oracle公司收購,是以Open Message Queue目前由Oracle公司旗下的開源社群負責維護,并成為Oracle的應用伺服器Glassfish的預設消息服務元件。

        Open MQ的主要特性包括如下方面:

1、可擴充的分布式消息伺服器叢集支援;

2、支援SOAP和HTTP協定消息格式;

3、支援Java和C用戶端API;

4、可擴充的JCA 1.5相容資源擴充卡;

5、流量與連接配接控制機制。

        更詳細的特性清單參考https://mq.java.net/features.html。

AMQP

        AMQP,即Advanced Message Queuing Protocol,進階消息隊列協定,是應用層協定的一個開放标準,為面向消息的中間件設計。AMQP的主要特征是面向消息、隊列、路由(包括點對點和釋出/訂閱)、可靠性、安全。AMQP在消息提供者和用戶端的行為進行了強制規定,使得不同賣商之間真正實作了互操作能力。JMS是早期消息中間件進行标準化的一個嘗試,它僅僅是在API級進行了規範,離建立互操作能力還差很遠。與JMS不同,AMQP是一個Wire級的協定,它描述了在網絡上傳輸的資料的格式,以位元組為流。是以任何遵守此資料格式的工具,其建立和解釋消息,都能與其他相容工具進行互操作。

        應用層的消息協定除了AMQP外,還有OpenWire和XMPP等,但是AMQP應用最為廣泛。

RabbitMQ

        RabbitMQ是實作AMQP(進階消息隊列協定)的消息中間件的一種,最初起源于金融系統,用于在分布式系統中存儲轉發消息,在易用性、擴充性、高可用性等方面表現較好。RabbitMQ遵從開源協定Mozilla公共許可證,目前最新穩定版本為3.1.1版。

        RabbitMQ的主要特性包括如下方面:

1、定義Exchange、隊列、通道等概念,使對消息投遞的控制更加精準靈活;

2、支援高可用,以及消息和隊列的持久化;

3、支援叢集,允許節點動态變化和節點故障;

4、支援衆多語言的用戶端,包括Java、Ruby、Python、.Net、PHP、Perl、C/C++、Erlang、Lisp、Haskell、Ocaml、Go等;

5、支援公有雲服務,包括Amazon EC2和Cloud Foundry等;

6、支援衆多的插件,功能可擴充;

7、高性能、消息吞吐量大。

        官方的特性清單參考http://www.rabbitmq.com/features.html。

OpenAMQ

        OpenAMQ 是一個業務消息産品,為你提供一個分布式的消息通訊架構。消息的異步傳遞的。主要為高性能和可靠性而設計。該項目伺服器端采用 GPL 授權協定,用戶端(Python、Java、Ruby、C)是 BSD 授權協定。目前的最新版本是1.3版。

OpenAMQ的特性如下:

1、部署的性能擴充性強;

2、官方提供C語言的用戶端API,其他語言的API由第三方提供,包括Python、Java JMS、Ruby;

3、支援叢集和高可用機制、性能較高。

        更多特性可以參考http://www.openamq.org/doc:user-1-introduction。

Apache Qpid

        Apache Qpid (Open Source AMQP Messaging) 是一個跨平台的企業通訊解決方案,實作了進階消息隊列協定,遵守Apache 2.0開源協定。提供了 Java、C++ 兩種服務端版本以及 Java、C++、.NET、Python和Ruby語言的用戶端。目前軟體的最新版本是0.22版。

        Apache Qpid的主要特點如下:

1、提供Java JMS相容的用戶端接口,用戶端支援C++、.NET、Python和Ruby語言;

2、提供C++和Java兩種版本的伺服器;

3、完全相容AMQP協定标準;

4、支援叢集、聯邦和災難恢複;

5、性能優越,速度快。

總結

        綜合上面對各個主流消息伺服器的特性分析,主要從成熟度,使用數量和功能特性方面進行選擇。最終較好的消息中間件候選者包括Apache ActiveMQ、JBoss HornetQ和RabbitMQ。使用最廣泛的是ActiveMQ,功能豐富并且對Web伺服器的整合相容性好;RabbitMQ使用度次之,号稱性能優良,關于ActiveMQ和RabbitMQ的性能測試比較可以參考http://www.cnblogs.com/amityat/archive/2011/08/31/2160293.html。

        如果希望和JBoss結合使用,建議首選Jboss HornetQ,實際上JBoss已經自帶。一般情況下建議選擇Apache ActiveMQ。如果業務應用對消息伺服器的性能有較高要求,則需要這些消息服務中間件進行性能測試才可确定最終選擇。