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

訊息佇列

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

1 ZeroMQ

http://zeromq.org/

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

http://www.rabbitmq.com/

官方定義:
- 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

http://activemq.apache.org/

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

https://activemq.apache.org/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

http://kafka.apache.org/

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

https://rocketmq.incubator.apache.org/

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孵化成為頂級專案,全球程式猿開始貢獻,前途也是不可限量的。