RabbitMQ,RocketMQ,Kafka 幾種消息隊列的對比

常用的幾款消息隊列的對比

前言

消息隊列的作用:

1、應用耦合:多應用間通過消息隊列對同一消息進行處理,避免調用接口失敗導致整個過程失敗;

2、異步處理:多應用對消息隊列中同一消息進行處理,應用間並發處理消息,相比串行處理,減少處理時間;

3、限流削峰:廣泛應用於秒殺或搶購活動中,避免流量過大導致應用系統掛掉的情況;

4、消息驅動的系統:系統分為消息隊列、消息生產者、消息消費者,生產者負責產生消息,消費者(可能有多個)負責對消息進行處理;

首先選擇消息隊列要滿足以下幾個條件:

1、開源

2、流行

3、兼容性強

消息隊列需要:

1、消息的可靠傳遞:確保不丟消息;

2、Cluster:支持集群,確保不會因為某個節點宕機導致服務不可用,當然也不能丟消息;

3、性能:具備足夠好的性能,能滿足絕大多數場景的性能要求。

RabbitMQ

RabbitMQ 2007年發佈,是一個在 AMQP (高級消息隊列協議)基礎上完成的,可復用的企業消息系統,是當前最主流的消息中間件之一。

優點

1、RabbitMQ 的特點 Messaging that just works,「開箱即用的消息隊列」。 RabbitMQ 是一個相對輕量的消息隊列,非常容易部署和使用;

2、多種協議的支持:支持多種消息隊列協議,算的上是最流行的消息隊列之一;

3、靈活的路由配置,和其他消息隊列不同的是,它在生產者 (Producer)和隊列(Queue)之間增加了一個Exchange模塊,你可以理解為交換機。這個Exchange模塊的作用和交換機也非常相似,根據配置的路由規則將生產者發出的消息分發到不同的隊 列中。路由的規則也非常靈活,甚至你可以自己來實現路由規則。

4、健壯、穩定、易用、跨平台、支持多種語言、文檔齊全,RabbitMQ的客戶端支持的編程語言大概是所有消息隊列中最多的;

5、管理界面較豐富,在互聯網公司也有較大規模的應用;

6、社區比較活躍。

缺點

1、RabbitMQ 對消息堆積的處理不好,在它的設計理念裏面,消息隊列是一個管道,大量的消息積壓是一種不正常的情況,應當盡量去避免。當大量消息積壓的時候,會導致RabbitMQ的性能急劇下降;

2、性能上有瓶頸,它大概每秒鐘可以處理幾萬到十幾萬條消息,這個對於大多數場景足夠使用了,如果對需求對性能要求非常高,那麼就不太合適了。

3、RabbitMQ 使用 Erlang。開發,Erlang 的學習成本還是很高的,如果後期進行二次開發,就不太容易了。

RocketMQ

RocketMQ出自阿里公司的開源產品,用 Java 語言實現,在設計時參考了 Kafka,並做出了自己的一些改進,消息可靠性上比 Kafka 更好。經歷過多次雙十一的考驗,性能和穩定性還是值得信賴的,RocketMQ在阿里集團被廣泛應用在訂單,交易,充值,流計算,消息推送,日誌流式處理,binglog分發等場景。

優點

1、單機吞吐量:十萬級;

2、可用性:非常高,分佈式架構;

3、消息可靠性:經過參數優化配置,消息可以做到0丟失,RocketMQ 的所有消息都是持久化的,先寫入系統 PAGECACHE,然後刷盤,可以保證內存與磁盤都有一份數據;

4、功能支持:MQ功能較為完善,還是分佈式的,擴展性好;

5、支持10億級別的消息堆積,不會因為堆積導致性能下降;

6、源碼是java,我們可以自己閱讀源碼,定製自己公司的MQ,可以掌控。

缺點

1、支持的客戶端語言不多,目前是 java 及 c++,其中 c++ 不成熟;

2、社區活躍度一般,作為國產的消息隊列,相比國外的比較流行的同類產品,在國際上還沒有那麼流行,與周邊生態系統的集成和兼容程度要略遜一籌;

3、沒有在 mq 核心中去實現 JMS 等接口,有些系統要遷移需要修改大量代碼。

Kafka

Apache Kafka是一個分佈式消息發佈訂閱系統。它最初由LinkedIn公司基於獨特的設計實現為一個分佈式的提交日誌系統( a distributed commit log),之後成為Apache項目的一部分。

這是一款為大數據而生的消息中間件,在數據採集、傳輸、存儲的過程中發揮着舉足輕重的作用。

優點

1、性能卓越,單機寫入TPS約在百萬條/秒,最大的優點,就是吞吐量高;

2、性能卓越,單機寫入TPS約在百萬條/秒,消息大小10個位元組;

3、可用性:非常高,kafka是分佈式的,一個數據多個副本,少數機器宕機,不會丟失數據,不會導致不可用;

4、消費者採用Pull方式獲取消息, 消息有序, 通過控制能夠保證所有消息被消費且僅被消費一次;

5、有優秀的第三方Kafka Web管理界面Kafka-Manager;

6、在日誌領域比較成熟,被多家公司和多個開源項目使用;

7、功能支持:功能較為簡單,主要支持簡單的MQ功能,在大數據領域的實時計算以及日誌採集被大規模使用

缺點

由於「攢一波再處理」導致延遲比較高

如何選擇合適的消息隊列

如果對於消息隊列的功能和性能要求不是很高,那麼RabbitMQ就夠了,開箱即用。

如果系統使用消息隊列主要場景是處理在線業務,比如在交易系統中用消息隊列傳遞訂單,RocketMQ 的低延遲和金融級的穩定性就可以滿足。

要處理海量的消息,像收集日誌、監控信息或是前端的埋點這類數據,或是你的應用場景大量使用 了大數據、流計算相關的開源產品,那 Kafka 就是最合適的了。

參考

【消息隊列及常見消息隊列介紹】//cloud.tencent.com/developer/article/1006035
【消息隊列高手課】//time.geekbang.org/column/intro/100032301
【消息隊列Kafka、RocketMQ、RabbitMQ的優劣勢比較】//zhuanlan.zhihu.com/p/60288391
【Kafka】//zh.wikipedia.org/wiki/Kafka
【RabbitMQ,RocketMQ,Kafka 幾種消息隊列的對比】//boilingfrog.github.io/2021/12/10/幾種常見的消息隊列的對比/