RocketMQ與Kafka對比
淘寶內部的交易系統使用了淘寶自主研發的Notify訊息中介軟體,使用Mysql作為訊息儲存媒介,可完全水平擴容,為了進一步降低成本,我們認為儲存部分可以進一步優化,2011年初,Linkin開源了Kafka這個優秀的訊息中介軟體,淘寶中介軟體團隊在對Kafka做過充分Review之後,Kafka無限訊息堆積,高效的持久化速度吸引了我們,但是同時發現這個訊息系統主要定位於日誌傳輸,對於使用在淘寶交易、訂單、充值等場景下還有諸多特性不滿足,為此我們重新用Java語言編寫了RocketMQ,定位於非日誌的可靠訊息傳輸(日誌場景也OK),目前RocketMQ在阿里集團被廣泛應用在訂單,交易,充值,流計算,訊息推送,日誌流式處理,binglog分發等場景。
為了方便大家選型,整理一份RocketMQ與Kafka的對比文件,文中如有錯誤之處,歡迎來函指正。vintage.wang@gmail.com
資料可靠性
- RocketMQ支援非同步實時刷盤,同步刷盤,同步Replication,非同步Replication
- Kafka使用非同步刷盤方式,非同步Replication/同步Replication
總結:RocketMQ的同步刷盤在單機可靠性上比Kafka更高,不會因為作業系統Crash,導致資料丟失。Kafka同步Replication理論上效能低於RocketMQ的同步Replication,原因是Kafka的資料已分割槽為單位組織,意味著一個Kafka例項上會有幾百個資料分割槽,RocketMQ一個例項上只有一個資料分割槽,RocketMQ可以充分利用IO Group Commit機制,批量傳輸資料,配置同步Replication與非同步Replication相比,效能損耗月20%~30%,Kafka沒有親自測試過,但是個人認為理論上會與低於RocketMQ。
效能對比
- Kafka單機寫入TPS約在百萬條/秒,訊息大小10個位元組
- RocketMQ單機寫入TPS單例項約7萬條/秒,單機部署3個Broker,可以跑到最高12萬條/秒,訊息大小10個位元組
總結:Kafka的TPS跑到單機百萬,主要是由於Producer端將多個小訊息合併,批量發向Broker。
RocketMQ為什麼沒有這麼做?
- Producer通常使用Java語言,快取過多訊息,GC是個很嚴重的問題
- Producer呼叫傳送訊息介面,訊息未傳送到Broker,向業務返回成功,此時Producer當機,會導致訊息丟失,業務出錯
- Producer通常為分散式系統,且每臺機器都是多執行緒傳送,我們認為線上的系統單個Producer每秒產生的資料量有限,不可能上萬。
- 快取的功能完全可以由上層業務完成。
單機支援的佇列數
- Kafka單機超過64個佇列/分割槽,Load會發生明顯的飆高現象,佇列越多,load越高,傳送訊息響應時間變長。Kafka分割槽數無法過多的問題
- RocketMQ單機支援最高5萬個佇列,Load不會發生明顯變化
佇列多有什麼好處?
- 單機可以建立更多Topic,因為每個Topic都是由一批佇列組成
- Consumer的叢集規模和佇列數成正比,佇列越多,Consumer叢集可以越大
訊息投遞實時性
- Kafka使用短輪詢方式,實時性取決於輪詢間隔時間,0.8以後版本支援長輪詢。
- RocketMQ使用長輪詢,同Push方式實時性一致,訊息的投遞延時通常在幾個毫秒。
消費失敗重試
- Kafka消費失敗不支援重試。
- RocketMQ消費失敗支援定時重試,每次重試間隔時間順延
總結:例如充值類應用,當前時刻呼叫運營商閘道器,充值失敗,可能是對方壓力過多,稍後再呼叫就會成功,如支付寶到銀行扣款也是類似需求。
這裡的重試需要可靠的重試,即失敗重試的訊息不因為Consumer當機導致丟失。
嚴格的訊息順序
- Kafka支援訊息順序,但是一臺Broker當機後,就會產生訊息亂序
- RocketMQ支援嚴格的訊息順序,在順序訊息場景下,一臺Broker當機後,傳送訊息會失敗,但是不會亂序
Mysql Binlog分發需要嚴格的訊息順序
定時訊息
- Kafka不支援定時訊息
- RocketMQ支援兩類定時訊息
- 開源版本RocketMQ僅支援定時Level,定時Level使用者可定製
- 阿里雲ONS支援定時Level,以及指定的毫秒級別的延時時間
分散式事務訊息
- Kafka不支援分散式事務訊息
- 阿里雲ONS支援分散式定時訊息,未來開源版本的RocketMQ也有計劃支援分散式事務訊息
訊息查詢
- Kafka不支援訊息查詢
- RocketMQ支援根據Message Id查詢訊息,也支援根據訊息內容查詢訊息(傳送訊息時指定一個Message Key,任意字串,例如指定為訂單Id)
總結:訊息查詢對於定位訊息丟失問題非常有幫助,例如某個訂單處理失敗,是訊息沒收到還是收到處理出錯了。
訊息回溯
- Kafka理論上可以按照Offset來回溯訊息
- RocketMQ支援按照時間來回溯訊息,精度毫秒,例如從一天之前的某時某分某秒開始重新消費訊息
總結:典型業務場景如consumer做訂單分析,但是由於程式邏輯或者依賴的系統發生故障等原因,導致今天消費的訊息全部無效,需要重新從昨天零點開始消費,那麼以時間為起點的訊息重放功能對於業務非常有幫助。
消費並行度
-
Kafka的消費並行度依賴Topic配置的分割槽數,如分割槽數為10,那麼最多10臺機器來並行消費(每臺機器只能開啟一個執行緒),或者一臺機器消費(10個執行緒並行消費)。即消費並行度和分割槽數一致。
-
RocketMQ消費並行度分兩種情況
- 順序消費方式並行度同Kafka完全一致
- 亂序方式並行度取決於Consumer的執行緒數,如Topic配置10個佇列,10臺機器消費,每臺機器100個執行緒,那麼並行度為1000。
訊息軌跡
- Kafka不支援訊息軌跡
- 阿里雲ONS支援訊息軌跡
開發語言友好性
- Kafka採用Scala編寫
- RocketMQ採用Java語言編寫
Broker端訊息過濾
- Kafka不支援Broker端的訊息過濾
- RocketMQ支援兩種Broker端訊息過濾方式
- 根據Message Tag來過濾,相當於子topic概念
- 向伺服器上傳一段Java程式碼,可以對訊息做任意形式的過濾,甚至可以做Message Body的過濾拆分。
訊息堆積能力
理論上Kafka要比RocketMQ的堆積能力更強,不過RocketMQ單機也可以支援億級的訊息堆積能力,我們認為這個堆積能力已經完全可以滿足業務需求。
開源社群活躍度
商業支援
- Kafka原開發團隊成立新公司,目前暫沒有相關產品看到
- RocketMQ在阿里雲上已經開放公測近半年,目前以雲服務形式免費供大家商用,並向使用者承諾99.99%的可靠性,同時徹底解決了使用者自己搭建MQ產品的運維複雜性問題
成熟度
- Kafka在日誌領域比較成熟
- RocketMQ在阿里集團內部有大量的應用在使用,每天都產生海量的訊息,並且順利支援了多次天貓雙十一海量訊息考驗,是資料削峰填谷的利器。
原文地址: https://github.com/alibaba/RocketMQ/wiki/rmq_vs_kafka
相關文章
- 【RocketMq】什麼是,對比ActiveMq和KafkaMQKafka
- RabbitMQ,RocketMQ,Kafka 幾種訊息佇列的對比MQKafka佇列
- RabbitMQ與Kafka選型對比MQKafka
- Kafka、RabbitMQ、RocketMQ訊息中介軟體的對比 —— 訊息傳送效能KafkaMQ
- RabbitMQ,RocketMQ,Kafka 訊息模型對比分析MQKafka模型
- 訊息中介軟體部署及比較:rabbitMQ、activeMQ、zeroMQ、rocketMQ、Kafka、redisMQKafkaRedis
- EMQX 4.x 版本更新:Kafka 與 RocketMQ 整合安全增強MQKafka
- RocketMQ 5.0 vs 4.9.X 圖解架構對比MQ圖解架構
- 譯文 | 科普:Pulsar 和 Kafka 架構對比Kafka架構
- 大資料教程系列之Kafka和activemq對比大資料KafkaMQ
- RabbitMQ、RocketMQ、Kafka延遲佇列實現MQKafka佇列
- 訊息中介軟體選型分析:從Kafka與RabbitMQ的對比看全域性KafkaMQ
- Python==與is對比Python
- redis與rabbitmq對比RedisMQ
- git與svn對比Git
- 對比 Redis 與 MemcachedRedis
- Prototype與JQuery對比jQuery
- 大資料流處理:Flume、Kafka和NiFi對比大資料KafkaNifi
- Spring 對Apache Kafka的支援與整合SpringApacheKafka
- 從消費者角度比較Kafka 與 RabbitMQ - OpenCredoKafkaMQ
- Terraform與其他工具對比ORM
- Kotlin 與 Java 對比KotlinJava
- synchronized 與 Lock 的對比synchronized
- 【HTML與XML的對比】HTMLXML
- JUnit 4 與 TestNG 對比
- pyppeteer與selenium對比
- Go 與 C++ 的對比和比較GoC++
- 訊息佇列的作用以及kafka和activemq的對比佇列KafkaMQ
- ubuntu與centos系統對比UbuntuCentOS
- 對比ubuntu與centos系統 UbuntuCentOS
- Flutter 與 iOS 原生 WebView 對比FlutteriOSWebView
- MySQL 半同步 與Raft對比MySqlRaft
- TDSQL-A與CK的對比SQL
- ListView 與 RecyclerView 簡單對比View
- Mobx 與 Redux 的效能對比Redux
- 客觀對比Node 與 GolangGolang
- OSI與TCP/IP的對比TCP
- openGauss 對比-磁碟與MOT