今天面試字節被問到的問題,當時沒有回答好,現在再重新梳理一下
兩者都是消息系統,但是kafka已經升級爲了流處理平臺
RocketMQ的出現是因爲kafka不支持在交易、訂單、充值等場景下許多特性,於是阿里編寫了rocketMQ,定位於非日誌的可靠消息傳輸;而kafka誕生的時候定位是日誌傳輸。
數據可靠性
RMQ支持異步實時刷盤、同步刷盤、同步Replication、異步Replication
同步刷盤在單機上可靠性比kafka高,不會因爲操作系統crash,倒是數據丟失
kafka使用異步刷盤、異步Replication
因爲異步,主從切換後存在數據丟失,以及數據不一致的情況
性能對比
kafka單機寫入tps在百萬/s,消息大小10字節
RMQ單機7萬/s,單機部署3個Broker,可以跑到12w/S,消息10字節
原因是kafka的Producer支持多個小消息合併,批量發向Broker;
這也是kafka適合OLAP的原因,實時性不高
RMQ不這麼做的原因
1:Producer通常使用java,緩存過多消息容易GC
2:Producer調用發送消息接口
3:Producer通常爲分佈式系統,且每臺機器都是多線程發送,團隊認爲線上的系統單個Producer每秒產生的數量有限,不可能上萬
4:緩存功能可以有上層業務實現
單機支持的隊列數
kafka單機超過64個隊列、分區。Load會發生明顯飈高,隊列越多,load越高,發送時間變長
RMQ支持5萬個隊列,load不發生明顯變化
kafka一個Topic一個文件,RMQ總共一個文件。
隊列多的好處
- 單機可以創建更多Topic
- 消費者的集羣規模和隊列書成正比,隊列越多Consumer集羣可以越大
消息投遞實時性
Kafka使用短輪詢,實時性取決於輪詢時間
RMQ使用長輪詢,同Push的方式實時性一致,一般幾個毫秒
失敗重試
kakfa不支持重試
RMQ支持定時重試,每次重試時間順延
嚴格的消息順序
kafka支持消息順序,但是一臺宕機,會產生消息混亂
RMQ支持嚴格的消息順序,Broker宕機,發送消息會失敗,不會亂序
定時消息,kafka不支持
分佈式事務消息
kafka不支持、開源版本不支持
消息回溯
kafka可以按照offset來回溯
RMQ可以按照時間回溯精度毫秒,有助重放
消息並行度
kafka並行度依賴Topic分區數,與其一致
RMQ分兩種
順序消費方式同kafka一樣
亂序方式取決Consumer的線程數。
消息堆積能力。kafka更強。RMQ支持億級