溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

常用消息隊(duì)列對(duì)比

發(fā)布時(shí)間:2020-07-24 12:05:10 來(lái)源:網(wǎng)絡(luò) 閱讀:1769 作者:CACZJZ 欄目:開(kāi)發(fā)技術(shù)

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

常用消息隊(duì)列對(duì)比

現(xiàn)在比較常見(jiàn)的MQ產(chǎn)品主要是ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ,當(dāng)然還有很多其他的產(chǎn)品。因?yàn)閭€(gè)人水平有限,就簡(jiǎn)單的比較下這幾種MQ的優(yōu)缺點(diǎn),作為自己選型的參考。

1 ZeroMQ

常用消息隊(duì)列對(duì)比

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號(hào)稱是“史上最快的消息隊(duì)列”,基于c語(yǔ)言開(kāi)發(fā)的,可以在任何平臺(tái)通過(guò)任何代碼連接,通過(guò)inproc、IPC、TCP、TIPC、多播傳送消息,支持發(fā)布-訂閱、推-拉、共享隊(duì)列等模式,高速異步I/O引擎。

根據(jù)官方的說(shuō)法,ZeroMQ是一個(gè)簡(jiǎn)單好用的傳輸層,像框架一樣的可嵌入的socket類庫(kù),使Socket編程更加簡(jiǎn)單、簡(jiǎn)潔、性能更高,是專門為高吞吐量/低延遲的場(chǎng)景開(kāi)發(fā)的。ZeroMQ與其他MQ有著本質(zhì)的區(qū)別,它根本不是消息隊(duì)列服務(wù)器,更類似與一個(gè)底層網(wǎng)絡(luò)通訊庫(kù),對(duì)原有Socket API進(jìn)行封裝,在使用的使用引入對(duì)應(yīng)的jar包即可,可謂是相當(dāng)靈活。

同時(shí),因?yàn)樗暮?jiǎn)單靈活,如果我們想作為消息隊(duì)列使用的話,需要開(kāi)發(fā)大量代碼。而且,ZeroMQ不支持消息持久化,其定位并不是安全可靠的消息傳輸,所以還需要自己編碼保證可靠性。簡(jiǎn)而言之一句話,ZeroMQ很強(qiáng)大,但是想用好需要自己實(shí)現(xiàn)。

2 RabbitMQ

常用消息隊(duì)列對(duì)比

官方定義:

  • 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語(yǔ)言編寫的開(kāi)源消息隊(duì)列,通過(guò)Erlang的Actor模型實(shí)現(xiàn)了數(shù)據(jù)的穩(wěn)定可靠傳輸。本身是實(shí)現(xiàn)AMQP的消息隊(duì)列,因此官方推薦,如果僅僅是使用RabbitMQ的話,建議使用AMQP 0-9-1的協(xié)議。不過(guò),因?yàn)槠淇蓴U(kuò)展性,可以通過(guò)插件的形式使用STOMP、XMPP、AMQP 1.0,還可以通過(guò)插件使用HTTP這種非消息的傳輸協(xié)議。所以,RabbitMQ可以說(shuō)是適應(yīng)性非常強(qiáng)的一個(gè)消息隊(duì)列中間件了。

當(dāng)然,不僅是協(xié)議支持的多,還因?yàn)樗鼘?shí)現(xiàn)了代理(Broker)架構(gòu),意味著消息在發(fā)送到客戶端之前可以在中央節(jié)點(diǎn)上排隊(duì)。此特性使得RabbitMQ易于使用和部署,適宜于很多場(chǎng)景如路由、負(fù)載均衡或消息持久化等,用消息隊(duì)列只需幾行代碼即可搞定。但是,這使得它的可擴(kuò)展性差,速度較慢,因?yàn)橹醒牍?jié)點(diǎn)增加了延遲,消息封裝后也比較大,如需配置RabbitMQ則需要在目標(biāo)機(jī)器上安裝Erlang環(huán)境。

總的來(lái)說(shuō),RabbitMQ在數(shù)據(jù)一致性、穩(wěn)定性和可靠性方面比較優(yōu)秀,而且直接或間接的支持多種協(xié)議,對(duì)多種語(yǔ)言支持良好。但是其性能和吞吐量差強(qiáng)人意,由于Erlang語(yǔ)言本身的限制,二次開(kāi)發(fā)成本較高。

3 ActiveMQ

常用消息隊(duì)列對(duì)比

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,它易于實(shí)現(xiàn)高級(jí)場(chǎng)景,而且只需付出低消耗。被譽(yù)為消息中間件的“瑞士×××”。

支持OpenWire、Stomp、AMQP v1.0、MQTT v3.1、REST、Ajax、Webservice等多種協(xié)議;完全支持JMS1.1和J2EE 1.4規(guī)范(事務(wù)、持久化、XA消息);支持持久化到數(shù)據(jù)庫(kù)。但是ActiveMQ不夠輕巧,而且對(duì)于隊(duì)列較多的情況支持不好,據(jù)說(shuō)還有丟消息的情況。

目前已經(jīng)有了其下一代消息產(chǎn)品Apollo。

4 Apollo

常用消息隊(duì)列對(duì)比

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為最快、最強(qiáng)健的STOMP服務(wù)器。支持STOMP、AMQP、MQTT、OpenWire協(xié)議,支持Topic、Queue、持久訂閱等消費(fèi)形式,支持對(duì)消息的多種處理,支持安全性處理,支持REST管理API。。。功能列表很長(zhǎng),最大的弊病就是目前市場(chǎng)接收度不夠,所以使用的并不廣泛。

5 Kafka

常用消息隊(duì)列對(duì)比

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月開(kāi)發(fā)并開(kāi)源的一個(gè)分布式流平臺(tái),現(xiàn)在是Apache的頂級(jí)項(xiàng)目,是一個(gè)高性能跨語(yǔ)言分布式Publish/Subscribe消息隊(duì)列系統(tǒng),以Pull的形式消費(fèi)消息。具有以下特性:快速持久化,可以在O(1)的系統(tǒng)開(kāi)銷下進(jìn)行消息持久化;高吞吐,在一臺(tái)普通的服務(wù)器上既可以達(dá)到10W/s的吞吐速率;完全的分布式系統(tǒng),Broker、Producer、Consumer都原生自動(dòng)支持分布式,自動(dòng)實(shí)現(xiàn)復(fù)雜均衡。因?yàn)樵O(shè)計(jì)之初是作為日志流平臺(tái)和運(yùn)營(yíng)消息管道平臺(tái),所以實(shí)現(xiàn)了消息順序和海量堆積。

Kafka自身服務(wù)與消息的生產(chǎn)和消費(fèi)都依賴與Zookeeper,使用Scala語(yǔ)言開(kāi)發(fā)。因?yàn)槠湎⒌南M(fèi)使用客戶端Pull方式,消息可以被多個(gè)客戶端消費(fèi),理論上消息會(huì)重復(fù),但是不會(huì)丟失(除非消息過(guò)期)。因此比較常用的場(chǎng)景是作為日志傳輸?shù)南⑵脚_(tái)。

6 RocketMQ

常用消息隊(duì)列對(duì)比

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

RocketMQ是阿里開(kāi)源的消息中間件,目前在Apache孵化,使用純Java開(kāi)發(fā),具有高吞吐量、高可用性、適合大規(guī)模分布式系統(tǒng)應(yīng)用的特點(diǎn)。RocketMQ思路起源于Kafka,但并不是簡(jiǎn)單的復(fù)制,它對(duì)消息的可靠傳輸及事務(wù)性做了優(yōu)化,目前在阿里集團(tuán)被廣泛應(yīng)用于交易、充值、流計(jì)算、消息推送、日志流式處理、binglog分發(fā)等場(chǎng)景,支撐了阿里多次雙十一活動(dòng)。

因?yàn)槭前⒗飪?nèi)部從實(shí)踐到產(chǎn)品的產(chǎn)物,因此里面很多接口、api并不是很普遍適用。其可靠性毋庸置疑,而且與Kafka一脈相承(甚至更優(yōu)),性能強(qiáng)勁,支持海量堆積。不過(guò)據(jù)說(shuō),沒(méi)有在mq核心上實(shí)現(xiàn)JMS,但是也無(wú)傷大雅。

7 寫在最后

其實(shí)對(duì)于這些消息隊(duì)列的產(chǎn)品,每一種都在某一領(lǐng)域占有一席,雖然ActiveMQ目前在社區(qū)已經(jīng)不是很活躍,但是其下一代產(chǎn)品Apollo已經(jīng)問(wèn)世。ZeroMQ小而美,RabbitMQ大而穩(wěn),Kakfa和RocketMQ快而強(qiáng)勁。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI