Broker差異
主從差異: kafka的master/slave是基於partition維度的,而rocketmq是基於broker維度的;kafka的master/slave是可以切換的,而rocketmq不行,當rocketmq的master宕機時,讀能被路由到slave上,但寫會被路由到此topic的其他broker上。
刷盤: rocketmq支持同步刷盤,也就是每次消息都等刷入磁盤后再返回,保證消息不丟失,但對吞吐量稍有影響。一般在主從結構下,選擇異步雙寫策略是比較可靠的選擇。
消息查詢:rocketmq支持消息查詢,除了queue的offset外,還支持自定義key。rocketmq對offset和key都做了索引,均是獨立的索引文件。
消費失敗重試與延遲消費: rocketmq針對每個topic都定義了延遲隊列,當消息消費失敗時,會發回給broker存入延遲隊列中,每個消費者在啟動時默認訂閱延遲隊列,這樣消費失敗的消息在一段時候后又能夠重新消費。延遲時間適合延遲級別一一對應的,延遲時間是隨失敗次數逐漸增加的,最后一次間隔2小時。當然發送消息是也可以指定延遲級別,這樣就能主動設置延遲消費,在一些特定場景下還是有作用的。
數據寫入: kafka每個partition獨占一個目錄,每個partition均有各自的數據文件.log;而rocketmq是每個topic共享一個數據文件commitlog因為kafka的topic一般有多個partition,所以kafka的數據寫入熟讀比rocketmq高出一個量級。但超過一定數量的文件同時寫入,會導致原先的順序寫轉為隨機寫,性能急劇下降,所以kafka的分區數量是有限制的。
服務治理: kafka用zookeeper來做服務發現和治理,broker和consumer都會向其注冊自身信息,同時訂閱相應的znode,這樣當有broker或者consumer宕機時能立刻感知,做相應的調整;而rocketmq用自定義的nameServer做服務發現和治理,其實時性差點,比如如果broker宕機,producer和consumer不會實時感知到,需要等到下次更新broker集群時(最長30S)才能做相應調整,服務有個不可用的窗口期,但數據不會丟失,且能保證一致性。但是某個consumer宕機,broker會實時反饋給其他consumer,立即觸發負載均衡,這樣能一定程度上保證消息消費的實時性。
Producer差異
發送方式:kafka默認使用異步發送的形式,有一個memory buffer暫存消息,同時會將多個消息整合成一個數據包發送,這樣能提高吞吐量,但對消息的實效有些影響;rocketmq可選擇使用同步或者異步發送。
發送響應:kafka的發送ack支持三種設置:消息存進memory buffer就返回;等到leader收到消息返回,等到leader和isr的follower都收到消息返回,當然kafka都是異步刷盤。rocketmq都需要等broker的響應確認,有同步刷盤,異步刷盤,同步雙寫,異步雙寫等策略,相比於kafka多了一個同步刷盤。
Consumer差異
消息過濾: rocketmq的queue和kafka的partition對應,但rocketmq的topic還能更加細分,可對消息加tag,同時訂閱時也可指定特定的tag來對消息做更進一步的過濾。或者向服務器上傳一段Java代碼,可以對消息做任意形式的過濾,甚至可以做Message Body的過濾拆分。
有序消息:rocketmq支持全局有序和局部有序,kafka也支持有序消息,但是如果某個broker宕機了,就不能在保證有序了。
消費確認:rocketmq僅支持手動確認,也就是消費完一條消息ack+1,會定期向broker同步消費進度,或者在下一次pull時附帶上offset。kafka支持定時確認,拉取到消息自動確認和手動確認,offset存在zookeeper上。
消費並行度:kafka的消費者默認是單線程的,一個Consumer可以訂閱一個或者多個Partition,一個Partition同一時間只能被一個消費者消費,也就是有多少個Partition就最多有多少個線程同時消費。rocketmq消費者分有序消費模式和並發消費模式,有序模式下,一個消費者也只存在一個線程消費;並發模式下,每次拉取的消息按consumeMessageBatchMaxSize(默認1)拆分后分配給消費者線程池,消費者線程池min=20,max=64。也就是每個queue的並罰度在20-64之間,一個topic有多個queue就相乘。所以rocketmq的並發度比Kafka高出一個量級。
事務消息:rocketmq指定一定程度上的事務消息,當前開源版本刪除了事務消息回查功能,事務機制稍微變得沒有這么可靠了,不過阿里雲的rocketmq支持可靠的事務消息;kafka不支持分布式事務消息。
————————————————
版權聲明:本文為CSDN博主「jb_hz」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_27529917/article/details/88205400