天天看點

Kafka 和 RocketMq 的對比

資料可靠性

  • RocketMQ支援異步實時刷盤,同步刷盤,同步Replication,異步Replication
  • Kafka使用異步刷盤方式,異步Replication
總結:RocketMQ的同步刷盤在單機可靠性上比​​Kafka​​​更高,不會因為作業系統Crash,導緻資料丢失。 同時同步Replication也比Kafka異步Replication更可靠,資料完全無單點。另外Kafka的Replication以topic為機關,支援主機當機,備機自動切換,但是這裡有個問題,由于是異步Replication,那麼切換後會有資料丢失,同時Leader如果重新開機後,會與已經存在的Leader産生資料沖突。開源版本的RocketMQ不支援Master當機,Slave自動切換為Master,​​阿裡雲版本的RocketMQ​​支援自動切換特性。

性能對比

  • ​​Kafka單機寫入TPS約在百萬條/秒,消息大小10個位元組​​
  • RocketMQ單機寫入TPS單執行個體約7萬條/秒,單機部署3個Broker,可以跑到最高12萬條/秒,消息大小10個位元組
總結:Kafka的TPS跑到單機百萬,主要是由于Producer端将多個小消息合并,批量發向Broker。

RocketMQ為什麼沒有這麼做?

  1. Producer通常使用Java語言,緩存過多消息,GC是個很嚴重的問題
  2. Producer調用發送消息接口,消息未發送到Broker,向業務傳回成功,此時Producer當機,會導緻消息丢失,業務出錯
  3. Producer通常為分布式系統,且每台機器都是多線程發送,我們認為線上的系統單個Producer每秒産生的資料量有限,不可能上萬。
  4. 緩存的功能完全可以由上層業務完成。

單機支援的隊列數

  • Kafka單機超過64個隊列/分區,Load會發生明顯的飙高現象,隊列越多,load越高,發送消息響應時間變長
  • RocketMQ單機支援最高5萬個隊列,Load不會發生明顯變化

隊列多有什麼好處?

  1. 單機可以建立更多Topic,因為每個Topic都是由一批隊列組成
  2. Consumer的叢集規模和隊列數成正比,隊列越多,Consumer叢集可以越大

消息投遞實時性

  • Kafka使用短輪詢方式,實時性取決于輪詢間隔時間
  • RocketMQ使用長輪詢,同Push方式實時性一緻,消息的投遞延時通常在幾個毫秒。

消費失敗重試

  • Kafka消費失敗不支援重試
  • RocketMQ消費失敗支援定時重試,每次重試間隔時間順延

總結:例如充值類應用,目前時刻調用營運商網關,充值失敗,可能是對方壓力過多,稍後在調用就會成功,如支付寶到銀行扣款也是類似需求。

這裡的重試需要可靠的重試,即失敗重試的消息不因為Consumer當機導緻丢失。

嚴格的消息順序

  • Kafka支援消息順序,但是一台Broker當機後,就會産生消息亂序
  • RocketMQ支援嚴格的消息順序,在順序消息場景下,一台Broker當機後,發送消息會失敗,但是不會亂序
Mysql Binlog分發需要嚴格的消息順序

定時消息

  • Kafka不支援定時消息
  • RocketMQ支援兩類定時消息
  • 開源版本RocketMQ僅支援定時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的github社群有250個個人、公司使用者登記了聯系方式,QQ群超過1000人。​​

商業支援

  • Kafka原開發團隊成立新公司,目前暫沒有相關産品看到
  • ​​RocketMQ在阿裡雲上已經開放公測近半年,目前以雲服務形式免費供大家商用,并向使用者承諾99.99%的可靠性,同時徹底解決了使用者自己搭建MQ産品的運維複雜性問題​​

成熟度

  • Kafka在日志領域比較成熟
  • RocketMQ在阿裡集團内部有大量的應用在使用,每天都産生海量的消息,并且順利支援了多次天貓雙十一海量消息考驗,是資料削峰填谷的利器。