一、什么是消息中間件
關注於數據的發送和接收,利用高效可靠的異步消息傳遞機制集成分布式系統。
二、為什么時候消息中間件
1.解耦合
2.異步
3.橫向擴展
4.安全可靠
5.順序保證
三、消息中間件方案
1.Java消息服務(Java Message Service)即JMS,是一個Java平台中關於面向消息中間件的API,用於在兩個應用程序之間或分布式中發送消息,進行異步通信。
2.AMQP(advanced message queuing protocol)是一個提供統一消息服務的應用層標准協議,基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件的不同產品,不同開發語言等條件限制。
JMS與AMQP對比
說明 |
JMS規范 |
AMQP協議 |
定義 |
java API |
wire-protocol |
跨語言 |
否 |
是 |
消息類型 |
p2p,pub/sub |
direct,fanout,topic,headers,system |
消息類型 |
TextMessage,MapMessage,BytesMessage,StreamMessage,ObjectMessage,Message |
byte[] |
綜合評價 |
JMS定義了Java API層面的標准;在Java體系中,多個clietn均可以通過JMS進行交互,不需要應用修改代碼,但是其對跨平台的支持較差 |
AMQP的主要特征是面向消息、隊列、路由、可靠性、安全 |
四、常用消息中間件
1.ActiveMQ
1)多語言和協議客戶端。
語言:
Java、C、C++、C#、Ruby、Perl、Python、PHP
協議:
OpenWire、Stomp、REST、WS、XMPP、AMQP
2)完全支持JMS1.1和J2EE1.4規范(持久化,XA消息和事務)
3)虛擬主題、組合目的、鏡像隊列
2.RabbitMQ
1)多語言客戶端:
Java、Python、Ruby、C、PHP等
2)事務支持/發布確定
3)消息持久化
3.Kafka
一種高吞吐量的分布式發布訂閱消息系統,是一個分布式、分區的、可靠的分布式日志存儲服務。
3個消息中間件的綜合評價
說明 |
ActiveMQ |
RabbitMQ |
Kafka |
跨語言 |
支持(Java優先) |
與語言無關 |
支持(Java優先) |
支持協議 |
OpenWire,Stomp,XMPP,AMQP |
AMQP |
|
優點 |
遵循JMS規范,安裝部署方便 |
繼承Erlang天生的並發性,用於金融行業,穩定性,安全性有保障 |
依賴ZK,可動態擴展節點,高性能,高吞吐量,無線擴容,消息可指定追溯 |
缺點 |
會莫名丟失消息 |
Erlang語言難度較大,不支持動態擴展 |
嚴格的順序機制,不支持消息優先,不支持標准消息協議,不利於平滑遷移 |
總結 |
適合中小型企業級消息應用場景,不適合上千個隊列的應用 |
適合對穩定性要求高的企業級引用 |
一般應用在大數據日志處理或實時性,可靠性要求稍低的場景。 |