MQ中間件選擇對比

在日常系統(tǒng)里會系統(tǒng)解耦、異步調(diào)用、流量削峰的時候使用消息中間件,在系統(tǒng)里被使用到的MQ主要有:RocketMQ、kafka,考慮到避免引入多種中間件,降低業(yè)務的下游系統(tǒng)需要同時接入多種消息中間,想討論是否可以選擇一種消息中間件,后續(xù)大家都盡量使用統(tǒng)一的MQ作為技術(shù)棧。

簡單介紹:

RocketMQ

RocketMQ是一款阿里巴巴開源的消息中間件,在2017年9月份成為Apache的頂級項目,是國內(nèi)首個互聯(lián)網(wǎng)中間件在 Apache 上的頂級項目。

RocketMQ的起源受到另一款消息中間件Kafka的啟發(fā)。最初,淘寶內(nèi)部的交易系統(tǒng)使用了淘寶自主研發(fā)的Notify消息中間件,使用Mysql作為消息存儲媒介,可完全水平擴容。為了進一步降低成本和提升寫入性能,需要在存儲部分可以進一步優(yōu)化,2011年初,Linkin開源了Kafka這個優(yōu)秀的消息中間件,淘寶中間件團隊在對Kafka做過充分Review之后,被Kafka無限消息堆積,高效的持久化速度所吸引。

不過當時Kafka主要定位于日志傳輸,對于使用在淘寶交易、訂單、充值等場景下還有諸多特性不滿足,例如:延遲消息,消費重試,事務消息,消息過濾等,這些都是一些企業(yè)級消息中間件需要具備的功能。為此,淘寶中間件團隊重新用Java語言編寫了RocketMQ,定位于非日志的可靠消息傳輸。不過隨著RocketMQ的演進,現(xiàn)在也支持了日志流式處理。

目前RocketMQ經(jīng)過了阿里多年雙十一大促的考驗,性能和穩(wěn)定性得到了充分的嚴重。目前在業(yè)界被廣泛應用在訂單,交易,充值,流計算,消息推送,日志流式處理,binlog分發(fā)等場景。

Kafka

Kafka是由Apache軟件基金會開發(fā)的一個開源流處理平臺,由ScalaJava編寫。Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理消費者在網(wǎng)站中的所有動作流數(shù)據(jù)。 這種動作(網(wǎng)頁瀏覽,搜索和其他用戶的行動)是在現(xiàn)代網(wǎng)絡(luò)上的許多社會功能的一個關(guān)鍵因素。 這些數(shù)據(jù)通常是由于吞吐量的要求而通過處理日志和日志聚合來解決。 對于像Hadoop一樣的日志數(shù)據(jù)和離線分析系統(tǒng),但又要求實時處理的限制,這是一個可行的解決方案。Kafka的目的是通過Hadoop的并行加載機制來統(tǒng)一線上和離線的消息處理,也是為了通過集群來提供實時的消息

對比維度

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

RocketMQ支持異步實時刷盤,同步刷盤,同步復制,異步復制

Kafka使用異步刷盤方式,異步復制/同步復制

總結(jié):RocketMQ的同步刷盤在單機可靠性上比Kafka更高,不會因為操作系統(tǒng)Crash,導致數(shù)據(jù)丟失。Kafka同步Replication理論上性能低于RocketMQ的同步Replication,原因是Kafka的數(shù)據(jù)以分區(qū)為單位組織,意味著一個Kafka實例上會??有幾百個數(shù)據(jù)分區(qū),RocketMQ一個實例上只有一個數(shù)據(jù)分區(qū),RocketMQ可以充分利用IO組Commit機制,批量傳輸數(shù)據(jù),配置同步Replication與異步Replication相比,性能損耗約20%~30%,Kafka沒有親自測試過,但是個人認為理論上會低于RocketMQ

性能對比

Kafka單機寫入TPS約在百萬條/秒,消息大小10個字節(jié)

RocketMQ單機寫入TPS單實例約7萬條/秒,單機部署3個Broker,可以跑到最高12萬條/秒,消息大小10個字節(jié)

多Topic對性能穩(wěn)定性的影響

當topic的數(shù)量從64上升到256,Kafka的吞吐量下降了98.37%

當topic的數(shù)量從64上升到256,RocketMQ的吞吐量下降了16%

When the number of topics increases from 64 to 256, the throughput of Kafka dropped by 98.37%.

這種差異是由于Kafka的每個主題和分區(qū)對應于一個物理文件。當主題數(shù)量增加時,將消息分散存儲到磁盤的策略將導致磁盤IO競爭,從而導致性能瓶頸。相反,Apache RocketMQ中的所有消息存儲在同一物理文件中。主題和分區(qū)的數(shù)量只是Apache RocketMQ的邏輯劃分?. 所以越來越多的主題不會對ApacheRocketMQ產(chǎn)生巨大的影響性能

消費失敗重試

卡夫卡消費失敗不支持重試。

RocketMQ消費失敗支持定時重試,每次重試間隔時間順延

總結(jié):例如充值類應用,當前時刻調(diào)用運營商網(wǎng)關(guān),充值失敗,可能是對方壓力過多,稍后再調(diào)用就會成功,如支付寶到銀行扣款也是類似需求。這里的重試需要可靠的重試,即失敗重試的消息不因為Consumer宕機導致丟失

嚴格的消息順序

卡夫卡支持消息順序,但是一臺代理宕機后,就會產(chǎn)生消息亂序

RocketMQ支持嚴格的消息順序,在順序消息場景下,一臺Broker宕機后,發(fā)送消息會失敗,但是不會亂序

開源社區(qū)活躍度和開源技術(shù)支持

卡夫卡社區(qū)人氣火爆

RocketMQ的GitHub更新較慢

|

|

Reference:

https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines

https://www.confluent.io/blog/how-choose-number-topics-partitions-kafka-cluster/

https://www.alibabacloud.com/blog/kafka-vs-rocketmq--multiple-topic-stress-test-results_69781

http://jm.taobao.org/2016/04/20/kafka-vs-rocketmq-3/

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

相關(guān)閱讀更多精彩內(nèi)容

  • 一、消息隊列為什么使用 分析:一個用消息隊列的人,不知道為啥用,這就有點尷尬。沒有復習這點,很容易被問蒙,然后就開...
    這一刻_776b閱讀 633評論 0 0
  • 在互聯(lián)網(wǎng)公司工作的RD們,對消息中間件最為熟悉不過了,如今隨著分布式系統(tǒng)架構(gòu)的盛行。一個高可用、高并發(fā)的消息中...
    高效匠人閱讀 14,170評論 6 27
  • IM系統(tǒng)的MQ消息中間件選型:Kafka還是RabbitMQ? 1、前言 在IM這種講究高并發(fā)、高消息吞吐的互聯(lián)網(wǎng)...
    匆匆歲月閱讀 3,255評論 1 111
  • 漸變的面目拼圖要我怎么拼? 我是疲乏了還是投降了? 不是不允許自己墜落, 我沒有滴水不進的保護膜。 就是害怕變得面...
    悶熱當乘涼閱讀 4,482評論 0 13
  • 感覺自己有點神經(jīng)衰弱,總是覺得手機響了;屋外有人走過;每次媽媽不聲不響的進房間突然跟我說話,我都會被嚇得半死!一整...
    章魚的擁抱閱讀 2,397評論 4 5

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