1. 程式人生 > >常用消息隊列對比

常用消息隊列對比

async 依賴 訂閱 lis arr 管道 while -o linked

作為中間件,消息隊列是分布式應用間交換信息的重要組件。消息隊列可駐留在內存或磁盤上, 隊列可以存儲消息直到它們被應用程序讀走。通過消息隊列,應用程序可以在不知道彼此位置的情況下獨立處理消息,或者在處理消息前不需要等待接收此消息。所以消息隊列可以解決應用解耦、異步消息、流量削鋒等問題,是實現高性能、高可用、可伸縮和最終一致性架構中不可以或缺的一環。下面對消息隊列就直接使用MQ表示。

現在比較常見的MQ產品主要是ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ,當然還有很多其他的產品。因為個人水平有限,就簡單的比較下這幾種MQ的優缺點,作為自己選型的參考。

1 ZeroMQ


ZeroMQ (also known as ØMQ, 0MQ, or zmq) looks like an embeddable networking library but acts like a concurrency framework. It gives you sockets that carry atomic messages across various transports like in-process, inter-process, TCP, and multicast. You can connect sockets N-to-N with patterns like fan-out, pub-sub, task distribution, and request-reply. It’s fast enough to be the fabric for clustered products. Its asynchronous I/O model gives you scalable multicore applications, built as asynchronous message-processing tasks. It has a score of language APIs and runs on most operating systems. ZeroMQ is from iMatix and is LGPLv3 open source.

ZeroMQ號稱是“史上最快的消息隊列”,基於c語言開發的,可以在任何平臺通過任何代碼連接,通過inproc、IPC、TCP、TIPC、多播傳送消息,支持發布-訂閱、推-拉、共享隊列等模式,高速異步I/O引擎。

根據官方的說法,ZeroMQ是一個簡單好用的傳輸層,像框架一樣的可嵌入的socket類庫,使Socket編程更加簡單、簡潔、性能更高,是專門為高吞吐量/低延遲的場景開發的。ZeroMQ與其他MQ有著本質的區別,它根本不是消息隊列服務器,更類似與一個底層網絡通訊庫,對原有Socket API進行封裝,在使用的使用引入對應的jar包即可,可謂是相當靈活。

同時,因為它的簡單靈活,如果我們想作為消息隊列使用的話,需要開發大量代碼。而且,ZeroMQ不支持消息持久化,其定位並不是安全可靠的消息傳輸,所以還需要自己編碼保證可靠性。簡而言之一句話,ZeroMQ很強大,但是想用好需要自己實現。

2 RabbitMQ


官方定義:
- Robust messaging for applications
- Easy to use
- Runs on all major operating systems
- Supports a huge number of developer platforms
- Open source and commercially supported

RabbitMQ是基於Erlang語言編寫的開源消息隊列,通過Erlang的Actor模型實現了數據的穩定可靠傳輸。本身是實現AMQP的消息隊列,因此官方推薦,如果僅僅是使用RabbitMQ的話,建議使用AMQP 0-9-1的協議。不過,因為其可擴展性,可以通過插件的形式使用STOMP、XMPP、AMQP 1.0,還可以通過插件使用HTTP這種非消息的傳輸協議。所以,RabbitMQ可以說是適應性非常強的一個消息隊列中間件了。

當然,不僅是協議支持的多,還因為它實現了代理(Broker)架構,意味著消息在發送到客戶端之前可以在中央節點上排隊。此特性使得RabbitMQ易於使用和部署,適宜於很多場景如路由、負載均衡或消息持久化等,用消息隊列只需幾行代碼即可搞定。但是,這使得它的可擴展性差,速度較慢,因為中央節點增加了延遲,消息封裝後也比較大,如需配置RabbitMQ則需要在目標機器上安裝Erlang環境。

總的來說,RabbitMQ在數據一致性、穩定性和可靠性方面比較優秀,而且直接或間接的支持多種協議,對多種語言支持良好。但是其性能和吞吐量差強人意,由於Erlang語言本身的限制,二次開發成本較高。

3 ActiveMQ


Apache ActiveMQ ™ is the most popular and powerful open source messaging and Integration Patterns server.
Apache ActiveMQ is fast, supports many Cross Language Clients and Protocols, comes with easy to use Enterprise Integration Patterns and many advanced features while fully supporting JMS 1.1 and J2EE 1.4. Apache ActiveMQ is released under the Apache 2.0 License.

ActiveMQ介於ZeroMQ和RabbitMQ之間。類似於ZeroMQ,它可以部署於代理模式和P2P模式。類似於RabbitMQ,它易於實現高級場景,而且只需付出低消耗。被譽為消息中間件的“瑞士軍刀”。

支持OpenWire、Stomp、AMQP v1.0、MQTT v3.1、REST、Ajax、Webservice等多種協議;完全支持JMS1.1和J2EE 1.4規範(事務、持久化、XA消息);支持持久化到數據庫。但是ActiveMQ不夠輕巧,而且對於隊列較多的情況支持不好,據說還有丟消息的情況。

目前已經有了其下一代消息產品Apollo。

4 Apollo


ActiveMQ Apollo is a faster, more reliable, easier to maintain messaging broker built from the foundations of the original ActiveMQ. It accomplishes this using a radically different threading and message dispatching architecture. Like ActiveMQ, Apollo is a multi-protocol broker and supports STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets.

Apache稱Apollo為最快、最強健的STOMP服務器。支持STOMP、AMQP、MQTT、OpenWire協議,支持Topic、Queue、持久訂閱等消費形式,支持對消息的多種處理,支持安全性處理,支持REST管理API。。。功能列表很長,最大的弊病就是目前市場接收度不夠,所以使用的並不廣泛。

5 Kafka


Kafka™ is used for building real-time data pipelines and streaming apps. It is horizontally scalable, fault-tolerant, wicked fast, and runs in production in thousands of companies.

Kafka是LinkedIn於2010年12月開發並開源的一個分布式流平臺,現在是Apache的頂級項目,是一個高性能跨語言分布式Publish/Subscribe消息隊列系統,以Pull的形式消費消息。具有以下特性:快速持久化,可以在O(1)的系統開銷下進行消息持久化;高吞吐,在一臺普通的服務器上既可以達到10W/s的吞吐速率;完全的分布式系統,Broker、Producer、Consumer都原生自動支持分布式,自動實現復雜均衡。因為設計之初是作為日誌流平臺和運營消息管道平臺,所以實現了消息順序和海量堆積。

Kafka自身服務與消息的生產和消費都依賴與Zookeeper,使用Scala語言開發。因為其消息的消費使用客戶端Pull方式,消息可以被多個客戶端消費,理論上消息會重復,但是不會丟失(除非消息過期)。因此比較常用的場景是作為日誌傳輸的消息平臺。

6 RocketMQ


Apache RocketMQ™ is an open source distributed messaging and streaming data platform.

RocketMQ是阿裏開源的消息中間件,目前在Apache孵化,使用純Java開發,具有高吞吐量、高可用性、適合大規模分布式系統應用的特點。RocketMQ思路起源於Kafka,但並不是簡單的復制,它對消息的可靠傳輸及事務性做了優化,目前在阿裏集團被廣泛應用於交易、充值、流計算、消息推送、日誌流式處理、binglog分發等場景,支撐了阿裏多次雙十一活動。

因為是阿裏內部從實踐到產品的產物,因此裏面很多接口、api並不是很普遍適用。其可靠性毋庸置疑,而且與Kafka一脈相承(甚至更優),性能強勁,支持海量堆積。不過據說,沒有在mq核心上實現JMS,但是也無傷大雅。

7 寫在最後
其實對於這些消息隊列的產品,每一種都在某一領域占有一席,雖然ActiveMQ目前在社區已經不是很活躍,但是其下一代產品Apollo已經問世。ZeroMQ小而美,RabbitMQ大而穩,Kakfa和RocketMQ快而強勁。RocketMQ雖然目前還很多不完善,但是一旦在Apache孵化成為頂級項目,全球程序猿開始貢獻,前途也是不可限量的。

常用消息隊列對比