MQ介紹與選型

MQ介紹與選型



MQ使用場景

異步通信


有些業務不想也不需要立即處理消息。消息隊列提供了異步處理機制,允許用戶把一個消息放入隊列,但並不立即處理它。想向隊列中放入多少消息就放多少,然後在需要的時候再去處理它們。


解耦


降低工程間的強依賴程度,針對異構系統進行適配。在項目啓動之初來預測將來項目會碰到什麼需求,是極其困難的。通過消息系統在處理過程中間插入了一個隱含的、基於數據的接口層,兩邊的處理過程都要實現這一接口,當應用發生變化時,可以獨立的擴展或修改兩邊的處理過程,只要確保它們遵守同樣的接口約束。


冗餘


有些情況下,處理數據的過程會失敗。除非數據被持久化,否則將造成丟失。消息隊列把數據進行持久化直到它們已經被完全處理,通過這一方式規避了數據丟失風險。許多消息隊列所採用的"插入-獲取-刪除"範式中,在把一個消息從隊列中刪除之前,需要你的處理系統明確的指出該消息已經被處理完畢,從而確保你的數據被安全的保存直到你使用完畢。


擴展性


因爲消息隊列解耦了你的處理過程,所以增大消息入隊和處理的頻率是很容易的,只要另外增加處理過程即可。不需要改變代碼、不需要調節參數。便於分佈式擴容。


過載保護


在訪問量劇增的情況下,應用仍然需要繼續發揮作用,但是這樣的突發流量無法提取預知;如果以爲了能處理這類瞬間峯值訪問爲標準來投入資源隨時待命無疑是巨大的浪費。使用消息隊列能夠使關鍵組件頂住突發的訪問壓力,而不會因爲突發的超負荷的請求而完全崩潰。


可恢復性


系統的一部分組件失效時,不會影響到整個系統。消息隊列降低了進程間的耦合度,所以即使一個處理消息的進程掛掉,加入隊列中的消息仍然可以在系統恢復後被處理。


順序保證


在大多使用場景下,數據處理的順序都很重要。大部分消息隊列本來就是排序的,並且能保證數據會按照特定的順序來處理。


緩衝


在任何重要的系統中,都會有需要不同的處理時間的元素。消息隊列通過一個緩衝層來幫助任務最高效率的執行,該緩衝有助於控制和優化數據流經過系統的速度。以調節系統響應時間。


數據流處理


分佈式系統產生的海量數據流,如:業務日誌、監控數據、用戶行爲等,針對這些數據流進行實時或批量採集彙總,然後進行大數據分析是當前互聯網的必備技術,通過消息隊列完成此類數據收集是最好的選擇。




MQ原理
MQ模型

Pub/Sub發佈訂閱(廣播):使用topic作爲通信載體


PTP點對點:使用queue作爲通信載體

MQ組成

Broker:消息服務器,作爲server提供消息核心服務


Producer:消息生產者,業務的發起方,負責生產消息傳輸給broker,


Consumer:消息消費者,業務的處理方,負責從broker獲取消息並進行業務邏輯處理


Topic:主題,發佈訂閱模式下的消息統一彙集地,不同生產者向topic發送消息,由MQ服務器分發到不同的訂閱者,實現消息的廣播


Queue:隊列,PTP模式下,特定生產者向特定queue發送消息,消費者訂閱特定的queue完成指定消息的接收


Message:消息體,根據不同通信協議定義的固定格式進行編碼的數據包,來封裝業務數據,實現消息的傳輸

MQ常用協議

AMQP協議


AMQP即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標準高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件不同產品,不同開發語言等條件的限制。


優點:可靠、通用


MQTT協議


MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協議,有可能成爲物聯網的重要組成部分。該協議支持所有平臺,幾乎可以把所有聯網物品和外部連接起來,被用來當做傳感器和致動器(比如通過Twitter讓房屋聯網)的通信協議。


優點:格式簡潔、佔用帶寬小、移動端通信、PUSH、嵌入式系統


STOMP協議


STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息協議,是一種爲MOM(Message Oriented Middleware,面向消息的中間件)設計的簡單文本協議。STOMP提供一個可互操作的連接格式,允許客戶端與任意STOMP消息代理(Broker)進行交互。


優點:命令模式(非topic/queue模式)


XMPP協議


XMPP(可擴展消息處理現場協議,Extensible Messaging and Presence Protocol)是基於可擴展標記語言(XML)的協議,多用於即時消息(IM)以及在線現場探測。適用於服務器之間的準即時操作。核心是基於XML流傳輸,這個協議可能最終允許因特網用戶向因特網上的其他任何人發送即時消息,即使其操作系統和瀏覽器不同。


優點:通用公開、兼容性強、可擴展、安全性高,但XML編碼格式佔用帶寬大


其他基於TCP/IP自定義的協議


有些特殊框架(如:redis、kafka、zeroMq等)根據自身需要未嚴格遵循MQ規範,而是基於TCP/IP自行封裝了一套協議,通過網絡socket接口進行傳輸,實現了MQ的功能。


MQ選型
RabbitMQ

使用Erlang編寫的一個開源的消息隊列,本身支持很多的協議:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它變的非常重量級,更適合於企業級的開發。同時實現了Broker架構,核心思想是生產者不會將消息直接發送給隊列,消息在發送給客戶端時先在中心隊列排隊。對路由(Routing),負載均衡(Load balance)、數據持久化都有很好的支持。多用於進行企業級的ESB整合。


ZeroMQ

又稱ØMQ、0MQ、ZMQ,號稱最快的消息隊列系統,專門爲高吞吐量/低延遲的場景開發,在金融界的應用中經常使用,偏重於實時數據通信場景。ZMQ能夠實現RabbitMQ不擅長的高級/複雜的隊列,但是開發人員需要自己組合多種技術框架,開發成本高。因此ZeroMQ具有一個獨特的非中間件的模式,更像一個socket library,你不需要安裝和運行一個消息服務器或中間件,因爲你的應用程序本身就是使用ZeroMQ API完成邏輯服務的角色。但是ZeroMQ僅提供非持久性的隊列,如果down機,數據將會丟失。如:Twitter的Storm中使用ZeroMQ作爲數據流的傳輸。


ZeroMQ套接字是與傳輸層無關的:ZeroMQ套接字對所有傳輸層協議定義了統一的API接口。默認支持進程內(inproc),進程間(IPC),多播,TCP協議,在不同的協議之間切換隻要簡單的改變連接字符串的前綴。可以在任何時候以最小的代價從進程間的本地通信切換到分佈式下的TCP通信。ZeroMQ在背後處理連接建立,斷開和重連邏輯。


特性:


無鎖的隊列模型


對於跨線程間的交互(用戶端和session)之間的數據交換通道pipe,採用無鎖的隊列算法CAS;在pipe的兩端註冊有異步事件,在讀或者寫消息到pipe的時,會自動觸發讀寫事件。


批量處理的算法


對於批量的消息,進行了適應性的優化,可以批量的接收和發送消息。


多核下的線程綁定,無須CPU切換


區別於傳統的多線程併發模式,信號量或者臨界區,zeroMQ充分利用多核的優勢,每個核綁定運行一個工作者線程,避免多線程之間的CPU切換開銷。


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等。


Redis

使用C語言開發的一個Key-Value的NoSQL數據庫,開發維護很活躍,雖然它是一個Key-Value數據庫存儲系統,但它本身支持MQ功能,所以完全可以當做一個輕量級的隊列服務來使用。對於RabbitMQ和Redis的入隊和出隊操作,各執行100萬次,每10萬次記錄一次執行時間。測試數據分爲128Bytes、512Bytes、1K和10K四個不同大小的數據。實驗表明:入隊時,當數據比較小時Redis的性能要高於RabbitMQ,而如果數據大小超過了10K,Redis則慢的無法忍受;出隊時,無論數據大小,Redis都表現出非常好的性能,而RabbitMQ的出隊性能則遠低於Redis。


Kafka

Apache下的一個子項目,使用scala實現的一個高性能分佈式Publish/Subscribe消息隊列系統,具有以下特性:


快速持久化:通過磁盤順序讀寫與零拷貝機制,可以在O(1)的系統開銷下進行消息持久化;


高吞吐:在一臺普通的服務器上既可以達到10W/s的吞吐速率;


高堆積:支持topic下消費者較長時間離線,消息堆積量大;


完全的分佈式系統:Broker、Producer、Consumer都原生自動支持分佈式,依賴zookeeper自動實現複雜均衡;


支持Hadoop數據並行加載:對於像Hadoop的一樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。

RocketMQ

阿里系下開源的一款分佈式、隊列模型的消息中間件,原名Metaq,3.0 版本名稱改爲RocketMQ,是阿里參照kafka設計思想使用java實現的一套mq。同時將阿里系內部多款mq產品(Notify、metaq)進行整合,只維護核心功能,去除了所有其他運行時依賴,保證核心功能最簡化,在此基礎上配合阿里上述其他開源產品實現不同場景下mq的架構,目前主要多用於訂單交易系統。


具有以下特點:


能夠保證嚴格的消息順序


提供針對消息的過濾功能


提供豐富的消息拉取模式


高效的訂閱者水平擴展能力


實時的消息訂閱機制


億級消息堆積能力


官方提供了一些不同於kafka的對比差異:


https://github.com/alibaba/RocketMQ/wiki/rmq_vs_kafka




MQ對比
配置使用方式

MQ


語言


支持協議


持久化策略


消息確認機制


批處理


消息處理模式(push-pull)


消息順序性


支持事務


集羣策略


容災


負載均衡


管理界面




RabbitMQ


Erlang


AMQP STOMP (STOMP 1.0, STOMP 1.1 and STOMP 1.2) MQTT HTTP(有三種方式)

XMPP


本地磁盤文件


有消息確認機制


支持批量發送消息


push


 單個消費者有序


支持


主從模式 支持自動選主


主從、鏡像隊列


 Rabbitmq-cluster或LVS或HAproxy


rabbitmqadmin




ActiveMQ


Java


AMQP MQTT OpenWire STOMP


AMQ(磁盤文件)、KahaDB(本地數據庫)、JDBC、LevelDB(本地數據庫)


AUTO_ACKNOWLEDGE = 1 自動確認 CLIENT_ACKNOWLEDGE = 2 客戶端手動確認 DUPS_OK_ACKNOWLEDGE = 3 自動批量確認 SESSION_TRANSACTED = 0 事務提交併確認 自定義的ACK_MODE: INDIVIDUAL_ACKNOWLEDGE = 4 單條消息確認


 支持批量發送消息


同時支持Push-pull


 單個消費者有序


支持


1、消費者集羣 2、Broker集羣(共享隊列) 3、主從模式(共享DB、KahaDB複製、共享文件系統)


共享存儲 ZooKeeper協調


Broker-Cluster(共享隊列)


ActiveMQ Web Console




ZeroMQ


C/C++


zmq_ipc(本地進程間通信) 基於Socket的通信協議:TCP、INROC 、IPC 、PGM


不支持持久化


無,更像NIO模式下的非阻塞事件模式


支持


請求響應模式(同步) 發佈訂閱模式(異步) 單向管道模型










Redis


C


自定義redis協議


支持磁盤持久化



支持


非嚴格意義push-pull


有序


支持


主從


主從或codis


LVS或codis


Redis-cli或redisLive




Kafka


scala


自定義


磁盤持久化


有消息確認機制


支持


Pull


Topic單個partition內有序



zookeeper分佈式多節點


分區副本


通過zookeeper調度topic分區


kafka-run-class.sh

Kafka-manager

Kafka- offset-monitor




性能對比
Rabbitmq VS ZeroMq VS ActiveMq

20,000條msg/每條消息容量1024 bytes



200,000 條msg/每條消息容量32 bytes



200條msg/每條容量32768 bytes

RabbitMq VS Redis

不同大小消息出隊QPS對比

RabbitMq VS Kafka

使用場景建議

MQ


TPS量級(持久化)


場景


備註




Rabbitmq


3500-4000msg/s


非海量高可靠性場景

大規模企業應用、ESB

複雜路由策略

異構系統整合


協議豐富兼容性強,功能完善,消息格式比較大,速度較慢,消息持久化對性能影響明顯




ZeroMq


>800000msg/s


高併發連接場景,如:在線遊戲

海量高實時性場景,如:股市行情


偏重於網絡開發,開發成本高,高級功能需自行實現,不建議做傳統MQ應用




ActiveMq


~3600msg/s


非海量高可靠場景

企業級應用

分佈式事務(XA)

異構系統整合


相對Rabbitmq較輕量級,性能相近,完整JMS支持、配置較複雜




Redis


~15000msg/s


高吞吐低延遲

大量小消息體(<10K)

順序性或排序要求

異構系統整合


輕量級MQ的快速簡單實現,容災與負載等功能需自行完善




Kafka


Input ~70000msg/s

Output >150000msg/s


日誌等海量數據流

DB數據同步

高堆積離線消息處理


非典型MQ,更偏重於流式數據批處理




參考:


http://www.rabbitmq.com/blog/tag/performance/


http://blog.x-aeon.com/2013/04/10/a-quick-message-queue-benchmark-activemq-rabbitmq-hornetq-qpid-apollo/


https://softwaremill.com/mqperf/


http://www.infoq.com/cn/news/2014/08/zeromq-not-first-choice/


http://zeromq.org /results:ib-tests-v206


http://www.kuntalganguly.com/2014/08/message-queue-comparision.html



發佈了21 篇原創文章 · 獲贊 19 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章