1 消息中間件java
消息中間件作爲市場比較經常使用的工具,消息隊列已經逐漸成爲企業IT系統內部通訊的核心手段。它具備低耦合、可靠投遞、廣播、流量控制、最終一致性等一系列功能,成爲異步RPC的主要手段之一。當今市面上有不少主流的消息中間件,如老牌的ActiveMQ、RabbitMQ,比較火熱的Kafka,阿里巴巴自主開發RocketMQ等。redis
2.1 Broker算法
消息服務器,做爲server提供消息核心服務數據庫
2.2 Producerapache
消息生產者,業務的發起方,負責生產消息傳輸給broker,瀏覽器
2.3 Consumer安全
消息消費者,業務的處理方,負責從broker獲取消息並進行業務邏輯處理服務器
2.4 Topic網絡
主題,發佈訂閱模式下的消息統一聚集地,不一樣生產者向topic發送消息,由MQ服務器分發到不一樣的訂閱者,實現消息的 廣播session
2.5 Queue
隊列,PTP模式下,特定生產者向特定queue發送消息,消費者訂閱特定的queue完成指定消息的接收
2.6 Message
消息體,根據不一樣通訊協議定義的固定格式進行編碼的數據包,來封裝業務數據,實現消息的傳輸
3 支持的協議:
3.1 AMQP協議
AMQP即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標準高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件不一樣產品,不一樣開發語言等條件的限制。
優勢:可靠、通用
3.2 MQTT協議
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通信協議,有可能成爲物聯網的重要組成部分。該協議支持全部平臺,幾乎能夠把全部聯網物品和外部鏈接起來,被用來當作傳感器和致動器(好比經過Twitter讓房屋聯網)的通訊協議。
優勢:格式簡潔、佔用帶寬小、移動端通訊、PUSH、嵌入式系統
3.3 STOMP協議
STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息協議,是一種爲MOM(Message Oriented Middleware,面向消息的中間件)設計的簡單文本協議。STOMP提供一個可互操做的鏈接格式,容許客戶端與任意STOMP消息代理(Broker)進行交互。
優勢:命令模式(非topic\queue模式)
3.4 XMPP協議
XMPP(可擴展消息處理現場協議,Extensible Messaging and Presence Protocol)是基於可擴展標記語言(XML)的協議,多用於即時消息(IM)以及在線現場探測。適用於服務器之間的準即時操做。核心是基於XML流傳輸,這個協議可能最終容許因特網用戶向因特網上的其餘任何人發送即時消息,即便其操做系統和瀏覽器不一樣。
優勢:通用公開、兼容性強、可擴展、安全性高,但XML編碼格式佔用帶寬大
3.5 其餘基於TCP/IP自定義的協議
有些特殊框架(如:redis、kafka、zeroMq等)根據自身須要未嚴格遵循MQ規範,而是基於TCP\IP自行封裝了一套協議,經過網絡socket接口進行傳輸,實現了MQ的功能。
4 消息中間件的應用場景
4.1 異步通訊
有些業務不想也不須要當即處理消息。消息隊列提供了異步處理機制,容許用戶把一個消息放入隊列,但並不當即處理它。想向隊列中放入多少消息就放多少,而後在須要的時候再去處理它們。
4.2 解耦
下降工程間的強依賴程度,針對異構系統進行適配。在項目啓動之初來預測未來項目會碰到什麼需求,是極其困難的。經過消息系統在處理過程當中間插入了一個隱含的、基於數據的接口層,兩邊的處理過程都要實現這一接口,當應用發生變化時,能夠獨立的擴展或修改兩邊的處理過程,只要確保它們遵照一樣的接口約束。
4.3 冗餘
有些狀況下,處理數據的過程會失敗。除非數據被持久化,不然將形成丟失。消息隊列把數據進行持久化直到它們已經被徹底處理,經過這一方式規避了數據丟失風險。許多消息隊列所採用的」插入-獲取-刪除」範式中,在把一個消息從隊列中刪除以前,須要你的處理系統明確的指出該消息已經被處理完畢,從而確保你的數據被安全的保存直到你使用完畢。
4.4 擴展性
由於消息隊列解耦了你的處理過程,因此增大消息入隊和處理的頻率是很容易的,只要另外增長處理過程便可。不須要改變代碼、不須要調節參數。便於分佈式擴容。
4.5過載保護
在訪問量劇增的狀況下,應用仍然須要繼續發揮做用,可是這樣的突發流量沒法提取預知;若是覺得了能處理這類瞬間峯值訪問爲標準來投入資源隨時待命無疑是巨大的浪費。使用消息隊列可以使關鍵組件頂住突發的訪問壓力,而不會由於突發的超負荷的請求而徹底崩潰。
4.6可恢復性
系統的一部分組件失效時,不會影響到整個系統。消息隊列下降了進程間的耦合度,因此即便一個處理消息的進程掛掉,加入隊列中的消息仍然能夠在系統恢復後被處理。
4.7 順序保證
在大多使用場景下,數據處理的順序都很重要。大部分消息隊列原本就是排序的,而且能保證數據會按照特定的順序來處理。
4.8緩衝
在任何重要的系統中,都會有須要不一樣的處理時間的元素。消息隊列經過一個緩衝層來幫助任務最高效率的執行,該緩衝有助於控制和優化數據流通過系統的速度。以調節系統響應時間。
4.9 數據流處理
分佈式系統產生的海量數據流,如:業務日誌、監控數據、用戶行爲等,針對這些數據流進行實時或批量採集彙總,而後進行大數據分析是當前互聯網的必備技術,經過消息隊列完成此類數據收集是最好的選擇。
5 消息中間件的優點:
5.1 異步解耦
5.2 提升響應時間
5.3 爲大數據提供幫助
5.4 異步消費能夠提供用戶的體驗
6.1 AMQP協議
AMQP即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標準高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件不一樣產品,不一樣開發語言等條件的限制。
優勢:可靠、通用
6.2 MQTT協議
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通信協議,有可能成爲物聯網的重要組成部分。該協議支持全部平臺,幾乎能夠把全部聯網物品和外部鏈接起來,被用來當作傳感器和致動器(好比經過Twitter讓房屋聯網)的通訊協議。
優勢:格式簡潔、佔用帶寬小、移動端通訊、PUSH、嵌入式系統
6.3 STOMP協議
STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息協議,是一種爲MOM(Message Oriented Middleware,面向消息的中間件)設計的簡單文本協議。STOMP提供一個可互操做的鏈接格式,容許客戶端與任意STOMP消息代理(Broker)進行交互。
優勢:命令模式(非topic\queue模式)
6.4 XMPP協議
XMPP(可擴展消息處理現場協議,Extensible Messaging and Presence Protocol)是基於可擴展標記語言(XML)的協議,多用於即時消息(IM)以及在線現場探測。適用於服務器之間的準即時操做。核心是基於XML流傳輸,這個協議可能最終容許因特網用戶向因特網上的其餘任何人發送即時消息,即便其操做系統和瀏覽器不一樣。
優勢:通用公開、兼容性強、可擴展、安全性高,但XML編碼格式佔用帶寬大
6.5 其餘基於TCP/IP自定義的協議
有些特殊框架(如:redis、kafka、zeroMq等)根據自身須要未嚴格遵循MQ規範,而是基於TCP\IP自行封裝了一套協議,經過網絡socket接口進行傳輸,實現了MQ的功能。
7.1 RocketMQ
阿里系下開源的一款分佈式、隊列模型的消息中間件,原名Metaq,3.0版本名稱改成RocketMQ,是阿里參照kafka設計思想使用java實現的一套mq。同時將阿里系內部多款mq產品(Notify、metaq)進行整合,只維護核心功能,去除了全部其餘運行時依賴,保證核心功能最簡化,在此基礎上配合阿里上述其餘開源產品實現不一樣場景下mq的架構,目前主要多用於訂單交易系統。
具備如下特色:
官方提供了一些不一樣於kafka的對比差別:
https://rocketmq.apache.org/docs/motivation/
7.2 RabbitMQ
使用Erlang編寫的一個開源的消息隊列,自己支持不少的協議:AMQP,XMPP, SMTP,STOMP,也正是如此,使的它變的很是重量級,更適合於企業級的開發。同時實現了Broker架構,核心思想是生產者不會將消息直接發送給隊列,消息在發送給客戶端時先在中心隊列排隊。對路由(Routing),負載均衡(Load balance)、數據持久化都有很好的支持。多用於進行企業級的ESB整合。
7.3 ActiveMQ
Apache下的一個子項目。使用Java徹底支持JMS1.1和J2EE 1.4規範的 JMS Provider實現,少許代碼就能夠高效地實現高級應用場景。可插拔的傳輸協議支持,好比:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports。RabbitMQ、ZeroMQ、ActiveMQ均支持經常使用的多種語言客戶端 C++、Java、.Net,、Python、 Php、 Ruby等。
7.4 Redis
使用C語言開發的一個Key-Value的NoSQL數據庫,開發維護很活躍,雖然它是一個Key-Value數據庫存儲系統,但它自己支持MQ功能,因此徹底能夠當作一個輕量級的隊列服務來使用。對於RabbitMQ和Redis的入隊和出隊操做,各執行100萬次,每10萬次記錄一次執行時間。測試數據分爲128Bytes、512Bytes、1K和10K四個不一樣大小的數據。實驗代表:入隊時,當數據比較小時Redis的性能要高於RabbitMQ,而若是數據大小超過了10K,Redis則慢的沒法忍受;出隊時,不管數據大小,Redis都表現出很是好的性能,而RabbitMQ的出隊性能則遠低於Redis。
7.5 Kafka
Apache下的一個子項目,使用scala實現的一個高性能分佈式Publish/Subscribe消息隊列系統,具備如下特性:
7.6 ZeroMQ
號稱最快的消息隊列系統,專門爲高吞吐量/低延遲的場景開發,在金融界的應用中常用,偏重於實時數據通訊場景。ZMQ可以實現RabbitMQ不擅長的高級/複雜的隊列,可是開發人員須要本身組合多種技術框架,開發成本高。所以ZeroMQ具備一個獨特的非中間件的模式,更像一個socket library,你不須要安裝和運行一個消息服務器或中間件,由於你的應用程序自己就是使用ZeroMQ API完成邏輯服務的角色。可是ZeroMQ僅提供非持久性的隊列,若是down機,數據將會丟失。如:Twitter的Storm中使用ZeroMQ做爲數據流的傳輸。
ZeroMQ套接字是與傳輸層無關的:ZeroMQ套接字對全部傳輸層協議定義了統一的API接口。默認支持 進程內(inproc) ,進程間(IPC) ,多播,TCP協議,在不一樣的協議之間切換隻要簡單的改變鏈接字符串的前綴。能夠在任什麼時候候以最小的代價從進程間的本地通訊切換到分佈式下的TCP通訊。ZeroMQ在背後處理鏈接創建,斷開和重連邏輯。
特性: