淺談一下RabbitMQ、Kafka和RocketMQ消息中間件對(duì)比
前言
不論Kafka還是RabbitMQ和RocketMQ,作為消息中間件,其作用為應(yīng)用解耦、異步通訊、流量削峰填谷等。 拿我之前參加的一個(gè)電商項(xiàng)目來說,訂單消息通過MQ從訂單系統(tǒng)到支付系統(tǒng)、庫存系統(tǒng)等,當(dāng)訂單信息寫入MQ后就不再關(guān)心后續(xù)操作,既達(dá)到了應(yīng)用解耦又達(dá)到異步通信。因?yàn)橛唵蔚牟l(fā)量較大,為了避免數(shù)據(jù)庫承受不住,在訂單信息持久化時(shí)通過MQ+定時(shí)任務(wù)將訂單信息均勻的持久到數(shù)據(jù)庫中,達(dá)到削峰填谷作用。 那為什么有這么多的MQ?這些MQ又有什么區(qū)別?本文基于RabbitMQ、Kafka、RocketMQ,從側(cè)重點(diǎn)、架構(gòu)模型、消息通訊以及其他方面對(duì)比說明。
側(cè)重點(diǎn)
每個(gè)MQ的側(cè)重點(diǎn)不一樣。
- RabbitMQ RabbitMQ由以高性能、健壯以及可伸縮性出名的Erlang語言編寫,在擴(kuò)展或刪除Rabbit服務(wù)節(jié)點(diǎn)時(shí)只需要同步erlang信息即可。另外rabbitmq在數(shù)據(jù)可靠性的問題上做了很大的努力,它保證在這里數(shù)據(jù)是非常可靠的。
- Kafka Kafka由Scala和Java編寫,與RabbitMQ不同,Kafka是一種高吞吐量的分布式消息中間件,其通過零拷貝、pagecahe技術(shù)以及分區(qū)的設(shè)計(jì)實(shí)現(xiàn)高吞吐,同時(shí)分區(qū)的設(shè)計(jì)也避免了消息存儲(chǔ)瓶頸問題。
- RocketMQ RocketMQ是阿里出品的,參考Kafka架構(gòu)使用Java語言重新編寫的一個(gè)消息中間件,彌補(bǔ)了Kafka的擴(kuò)展性,在Kafka基礎(chǔ)上擴(kuò)展了多種消息模式,比如延遲消息、事務(wù)消息。
架構(gòu)模型
- RabbitMQ
RabbitMQ 基于AMQP協(xié)議實(shí)現(xiàn),其模型如下:

Kafka與RocketMQ架構(gòu)類似,RocketMQ使用NameServer代替了Zookeeper,這一點(diǎn)我覺得對(duì)開發(fā)人員是比較友好的,少了一個(gè)組件。
- Kafka

- RocketMQ

消息通訊
- RabbitMQ
RabbitMQ支持發(fā)布訂閱、Topic及RPC多種通訊方式,滿足大部分消息通訊,并支持死信隊(duì)列。另外,RabbitMQ的插件社區(qū)支持豐富的插件,可通過安裝插件添加額外的功能。例如,延遲隊(duì)列、優(yōu)先隊(duì)列、管理控制臺(tái)等插件。
- Kafka
相比RabbitMQ,Kafka只有單一的Topic通訊方式,消息在消費(fèi)后依然不支持死信隊(duì)列、延遲隊(duì)列等。
- RocketMQ
RocketMQ也是基于Topic進(jìn)行通訊,畢竟架構(gòu)模型相似,不過RocketMQ本身支持延遲消息、事務(wù)消息等,功能比較豐富。
其他對(duì)比
| RabbitMQ | Kafka | RocketMQ | |
| 社區(qū)活躍度 | 高 | 較高 | 一版 |
| 持久化 | 支持 | 支持 | 支持 |
| 并發(fā)吞吐 | 高 | 極高 | 極高 |
| 時(shí)效性 | us級(jí) | ms級(jí) | ms級(jí) |
| 數(shù)據(jù)可靠 | 極高 | 高 | 高 |
| 應(yīng)用場景 | 高可靠交易系統(tǒng) | 日志系統(tǒng)、大數(shù)據(jù)應(yīng)用 | 互聯(lián)網(wǎng)高并發(fā)、高可用應(yīng)用 |
總結(jié)
每個(gè)MQ的功能及作用大差不差,都有自己的優(yōu)勢以及不足,選擇適合業(yè)務(wù)的MQ就可以。
到此這篇關(guān)于淺談一下RabbitMQ、Kafka和RocketMQ消息中間件對(duì)比的文章就介紹到這了,更多相關(guān)RabbitMQ、Kafka和RocketMQ對(duì)比內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot通用分支處理超級(jí)管理員權(quán)限邏輯
這篇文章主要為大家介紹了springboot通用分支處理超級(jí)管理員的權(quán)限邏輯,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
SpringMvc+Mybatis+Pagehelper分頁詳解
這篇文章主要介紹了SpringMvc+Mybatis+Pagehelper分頁詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下的相關(guān)資料2017-01-01
springboot不同環(huán)境使用不同配置文件打包方式
這篇文章主要介紹了springboot不同環(huán)境使用不同配置文件打包方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
spring aop實(shí)現(xiàn)接口超時(shí)處理組件的代碼詳解
這篇文章給大家介紹了spring aop實(shí)現(xiàn)接口超時(shí)處理組件,文中有詳細(xì)的實(shí)現(xiàn)思路,并通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02
Java實(shí)現(xiàn)短信驗(yàn)證碼的示例代碼
Java是一種流行的編程語言,驗(yàn)證碼是一種常用的網(wǎng)絡(luò)安全技術(shù)。Java發(fā)展至今,網(wǎng)上也出現(xiàn)了各種各樣的驗(yàn)證碼,下面是用Java實(shí)現(xiàn)短信驗(yàn)證碼的總結(jié),感興趣的可以了解一下2023-03-03
springboot IDEA啟動(dòng)兩個(gè)端口服務(wù)nginx負(fù)載過程
這篇文章主要介紹了springboot IDEA啟動(dòng)兩個(gè)端口服務(wù)nginx負(fù)載過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
Java中創(chuàng)建線程的兩種方式詳細(xì)說明
這篇文章主要介紹了Java中創(chuàng)建線程的兩種方式詳細(xì)說明,Java使用java.lang.Thread類代表線程,所有的線程對(duì)象都必須是Thread類或其子類的實(shí)例,每個(gè)線程的作用是完成一定的任務(wù),實(shí)際上就是執(zhí)行一段程序流即一段順序執(zhí)行的代碼,需要的朋友可以參考下2023-11-11

