Kafka vs RocketMQ

本文對比說明Kafka和RocketMq的區(qū)別, 目的:為了說明Kafka為什么比RocketMq快

1. 設(shè)計理念

CAP原理

9fd2d05521e043048888da821f43edb4_image.png

CAP原則又稱CAP定理,指的是在一個分布式系統(tǒng)中,Consistency(一致性)、 
Availability(可用性)、Partition tolerance(分區(qū)容錯性),三者不可得兼。

  • 一致性(C):在分布式系統(tǒng)中的所有數(shù)據(jù)備份,在同一時刻是否同樣的值。(等同于所有節(jié)點(diǎn)訪問同一份最新的數(shù)據(jù)副本)
  • 可用性(A):在集群中一部分節(jié)點(diǎn)故障后,集群整體是否還能響應(yīng)客戶端的讀寫請求。(對數(shù)據(jù)更新具備高可用性)
  • 分區(qū)容忍性(P):以實(shí)際效果而言,分區(qū)相當(dāng)于對通信的時限要求。系統(tǒng)如果不能在時限內(nèi)達(dá)成數(shù)據(jù)一致性,就意味著發(fā)生了分區(qū)的情況,必須就當(dāng)前操作在C和A之間做出選擇。

Kafka和RocketMq分別對CAP進(jìn)行了取舍

  • Kafka優(yōu)先保證了A, 對C進(jìn)行了降級
  • RocketMq優(yōu)先保證了C, 對A進(jìn)行了降級

下文分別就各個特性說明

2. 特性對比

2.1 部署結(jié)構(gòu)

Kafka

da6034d7cd88492fad1510f29460b304_image.png

RocketMq

c3148d6425ea430d821340598d2dbf0c_image.png
5f4e9ebe19a74ed6bb19a73e164c7092_image.png
  • kafka通過zookeeper來進(jìn)行協(xié)調(diào),具備選舉能力 (趨向于高可用性,易維護(hù) )
1. 某個partition的master掛了,該partition對應(yīng)的某個slave會升級為主對外提供服務(wù)
2. 缺陷: 異步Replication下自動選主數(shù)據(jù)可能丟失
  • rocketMq通過自身的namesrv進(jìn)行協(xié)調(diào), 不具備選主能力 (去向于數(shù)據(jù)一致性, 數(shù)據(jù)不丟失)
1. Mq只能保證當(dāng)一個broker掛了,把原本寫到這個broker的請求遷移到其他broker上面,而并不是這個broker對應(yīng)的slave升級為主
2. 維護(hù)上沒有那么方便
  • kafka節(jié)點(diǎn)可以同時包含master和slave
  • 節(jié)點(diǎn)只能是master或slave

2.2 吞吐量

Kafka

97a2971cc8a04c14b45cfb7ed9b017a0_image.png

RocketMq

38bcd565775f4d0fa34b8904c980cdf6_image.png
  • kafka partition的數(shù)量和對應(yīng)的物理文件是一一對應(yīng)的
 1. 這種存儲方式, 同一個toptic多文件并發(fā)寫入, 對于每個文件來說是順序IO,  吞吐量很高
 2. 但是當(dāng)并發(fā)的讀寫多個partition的時候,對應(yīng)多個文件的順序IO,表現(xiàn)在文件系統(tǒng)的磁盤層面,還是隨機(jī)IO

  • rocketMq采用了單一的日志文件,即把同1臺機(jī)器上面所有topic的所有queue的消息存放在一個文件里面
 1. 這種方式, 避免了多toptic下隨機(jī)的磁盤寫入
 2. topic數(shù)量增多qps不會明顯下降

 對于ConsumeQueue,是完全的順序讀寫
 對于CommitLog,Producer對其“順序?qū)憽?,Consumer卻是對其“隨機(jī)讀”

RocketMq CommitLog文件結(jié)構(gòu)

b700ff25db294c50b7067cdce5a8697c_image.png
為了優(yōu)化Consumer對CommitLog的隨機(jī)讀:

CommitLog進(jìn)行了結(jié)構(gòu)化設(shè)計: CommitLog  -> MappedFileQueue -> MappedFile

其中真正存儲數(shù)據(jù)的是MappedFile。每個文件大小為1G,不滿則填充空白,  

MappedFile進(jìn)行內(nèi)存映射, 保證高效隨機(jī)讀

吞吐量對比

457895a38ee548798619ace2d253d187_image.png
 在機(jī)械硬盤的條件下:  吞吐量對比如上
 
 原因:
 1. kafka的多文件并發(fā)寫入 VS rocketMq的單文件寫入
 2. kafka在producer端做了數(shù)據(jù)合并,批量發(fā)送,性能是rocketmq的十倍(rocketmq沒有做這層處理)
     
rocketmq producer端不做緩存的原因:
 1. Producer通常使用Java語言,緩存過多消息,GC是個很嚴(yán)重的問題
 2. Producer調(diào)用發(fā)送消息接口,消息未發(fā)送到Broker,向業(yè)務(wù)返回成功,此時Producer宕機(jī),會導(dǎo)致消息丟失,業(yè)務(wù)出錯
 3. Producer通常為分布式系統(tǒng),且每臺機(jī)器都是多線程發(fā)送,我們認(rèn)為線上的系統(tǒng)單個Producer每秒產(chǎn)生的數(shù)據(jù)量有限,不可能上萬。
 4. 緩存的功能完全可以由上層業(yè)務(wù)完成

2.3 數(shù)據(jù)可靠性

rocketmq:支持異步實(shí)時刷盤,同步刷盤,同步Replication,異步Replication

kafka:支持異步/同步刷盤,異步/同步Replication,同步下性能極具下降

缺省Kafka是異步刷盤,調(diào)用 1次/3秒 fsync

 1. RocketMQ的同步刷盤在單機(jī)可靠性上比Kafka更高,不會因?yàn)椴僮飨到y(tǒng)Crash,導(dǎo)致數(shù)據(jù)丟失。
 2. 同時同步Replication也比Kafka異步Replication更可靠,數(shù)據(jù)完全無單點(diǎn)。
 3. Kafka的Replication以topic為單位,支持主機(jī)宕機(jī),備機(jī)自動切換,但是這里有個問題,由于是異步Replication,那么切換后會有數(shù)據(jù)丟失,
 4. 同時Leader如果重啟后,會與已經(jīng)存在的Leader產(chǎn)生數(shù)據(jù)沖突。
 5. 開源版本的RocketMQ不支持Master宕機(jī),Slave自動切換為Master,阿里云版本的支持自動切換特性。

2.4 消息重試機(jī)制

kafka: 支持消息發(fā)送失敗重試機(jī)制, 但是只能是固定的重試間隔 (默認(rèn)嘗試3次)

rocketmq: 支持消息發(fā)送失敗重試機(jī)制(可以使用delay定時的嘗試發(fā)送/接收消息,以及嘗試的機(jī)會)
 1. exception的情況,一般重復(fù)16次 10s、30s、1mins、2mins、3mins等。注意reconsumeTimes這個參數(shù); 
 2. 超時情況,這種情況MQ會無限制的發(fā)送給消費(fèi)端。這種情況就是Consumer端沒有返回

2.5 消息順序性

kafka: consumer只能消費(fèi)一個partition,來保障順序?qū)?
rocketmq:嚴(yán)格的消息順序,在順序消息場景下,一臺broker宕機(jī)后,發(fā)送消息會失敗,但是不會亂序


消息重復(fù)問題,通過消費(fèi)方冪等來解決

2.6 分布式事務(wù)消息

 分布式事務(wù)消息:

 1. Kafka不支持分布式事務(wù)消息
 2. RocketMQ阿里云版本支持事務(wù)消息, 未來開源版本的RocketMQ也有計劃支持分布式事務(wù)消息

9ebfdeac52d0494aa76496fe69a445dc_image.png

2.7 消息投遞實(shí)時性

kafka: 使用短輪詢, 實(shí)時性取決于輪詢間隔時間,  (kafka 0.8版本后支持long pull長輪詢)

rocketmq: 使用長輪詢,同push方式實(shí)時性一致,消息的投遞延時通常在幾個毫秒

2.8 定時消息

 Kafka不支持定時消息

 RocketMQ支持兩類定時消息:
 1. 開源版本RocketMQ僅支持定時Level
 2. 阿里云ONS支持定時Level,以及指定的毫秒級別的延時時間

2.9 消息查詢

Kafka不支持消息查詢

rocketmq 可以根據(jù)messageId查詢消息信息

2.10 消息回溯

kafka/rocketmq 都支持offset

RocketMQ支持按照時間來回溯消息,精度毫秒

2.11 消費(fèi)并行度

kafka 依賴topic配置的分區(qū)數(shù),即消費(fèi)并行度和分區(qū)數(shù)一致

rocketmq: 
 1. 順序消費(fèi)方式并行度同Kafka完全一致
 2. 亂序消費(fèi)方式并行度取決于consumer的線程數(shù)
 (如topic配置10個隊(duì)列,10臺機(jī)器消費(fèi),每臺機(jī)器100個線程,那么并行度為1000

2.12 消息堆積能力

理論上Kafka要比RocketMQ的堆積能力更強(qiáng),不過RocketMQ單機(jī)也可以支持億級的消息堆積能力,
我們認(rèn)為這個堆積能力已經(jīng)完全可以滿足業(yè)務(wù)需求。

2.13 consumer負(fù)載均衡

kafka:
首先為每個Consumer Group選出了一個Coordinator,所有的Consumer要先找到這個Coordinator,
Coordinator從所有Consumer中,選出了一個Master Consumer,讓它負(fù)載分配。它分好之后,
把分配結(jié)果傳給其他的Consumer

rocketmq:
consumer主動上報信息給broker,broker進(jìn)行收集consumer信息,consumer主動獲取broker上
topic的consumer group中所有consumer的列表,每個consumer自己計算對應(yīng)的
consumerMessageList

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容