Kafka vs RocketMQ—— Topic數量對單機性能的影響-轉自阿里中間件


引言

上一期我們對比了三類消息產品(Kafka、RabbitMQ、RocketMQ)單純發送小消息的性能,受到了程序猿們的廣泛關注,其中大家對這種單純的發送場景感到並不過癮,因為沒有任何一個網站的業務只有發送消息。本期,我們就來模擬一個真實的場景:

  1. 消息的發送和訂閱一定是共存的
  2. 要支持多個訂閱端訂閱自己感興趣的消息
    鑒於上一期Kafka和RocketMQ的指標和關注度很高,本期我們將只針對這兩個產品,對比在上述場景中,究竟誰更勝一籌。在正式開始測試之前,首先要向大家明確2個概念:

Topic為何物

Topic是消息中間件里一個重要的概念,每一個Topic代表了一類消息,有了多個Topic,就可以對消息進行歸類與隔離。

可以參照下圖的動物園喂食模型,每一種動物都只能消費相對應的食品。

分區為何物

Kafka和RocketMQ都是磁盤消息隊列的模式,對於同一個消費組,一個分區只支持一個消費線程來消費消息。過少的分區,會導致消費速度大大落后於消息的生產速度。所以在實際生產環境中,一個Topic會設置成多分區的模式,來支持多個消費者,參照下圖:

在互聯網企業的實際生產環境中,Topic數量和分區都會比較多,這就要求消息中間件在多Topic共存的時候,依然能夠保證服務的穩定性。下面就進入測試環節,看看消息發送端,訂閱端共存時,Kafka和RocketMQ對多Topic的處理能力。

測試目的

對比發送端、接收端共存情況下,Topic數量對Kafka、RocketMQ的性能影響,分區數采用8個分區。這次壓測我們只關注服務端的性能指標,所以壓測的退出標准是:

不斷增加發送端的壓力,直到系統吞吐量不再上升,而響應時間拉長。此時服務端出現性能瓶頸,獲取相應的系統最佳吞吐量,整個過程中保證消息沒有累積。

測試場景

默認每個Topic的分區數為8,每個Topic對應一個訂閱者,逐步增加Topic數量。得到如下數據:


























































產品



Topic數量



發送端並發數



發送端RT(ms)



發送端TPS



消費端TPS



RocketMQ

64 800 8 9w 8.6w
128 800 9 7.8w 7.7w
256 800 10 7.5w 7.5w


Kafka

64 800 5 13.6w 13.6w
128 256 23 8500 8500
256 256 133 2215 2352

可以看到,不論Topic數量是多少,Kafka和RocketMQ均能保證發送端和消費端的TPS持平,就是說,保證了消息沒有累積。

根據Topic數量的變化,畫出二者的消息處理能力的對比曲線如下圖:

從圖上可以看出:

  1. Kafka在Topic數量由64增長到256時,吞吐量下降了98.37%。
  2. RocketMQ在Topic數量由64增長到256時,吞吐量只下降了16%。

為什么兩個產品的表現如此懸殊呢?這是因為Kafka的每個Topic、每個分區都會對應一個物理文件。當Topic數量增加時,消息分散的落盤策略會導致磁盤IO競爭激烈成為瓶頸。而RocketMQ所有的消息是保存在同一個物理文件中的,Topic和分區數對RocketMQ也只是邏輯概念上的划分,所以Topic數的增加對RocketMQ的性能不會造成太大的影響。

測試結論

在消息發送端,消費端共存的場景下,隨着Topic數的增加Kafka吞吐量會急劇下降,而RocketMQ則表現穩定。因此Kafka適合Topic和消費端都比較少的業務場景,而RocketMQ更適合多Topic,多消費端的業務場景。

附錄:

測試環境

服務端為單機部署,機器配置如下:




















CPU 24核
內存 94G
硬盤 Seagate Constellation ES (SATA 6Gb/s) 2,000,398,934,016 bytes [2.00 TB] 7202 rpm
網卡 1000Mb/s


 

應用版本:
















消息中間件 版本
Kafka 0.8.2
RocketMQ 3.4.6

測試腳本
























壓力端 Jmeter的java客戶端
消息大小 128字節
並發數 能達到服務端最大TPS的最優並發
Topic分區數量 8
刷盤策略 異步落盤

未完待續

經過上面的測試,RocketMQ幾乎是完勝Kafka,其實這並不奇怪,因為RocketMQ就是針對互聯網的生產要求孕育而生的,讀者現在也應該明白為什么RocketMQ可以支撐阿里集團的海量消息業務了吧。

本期測試暫時告一段落了,測試中涉及到的多Topic場景,其實壓測時間均只有20分鍾,對於一個消息中間件產品來說,過短的執行時間是無法判斷它們的穩定性的。下一期我們會繼續探索多分區場景下,Kafka和RocketMQ對外服務的穩定性。敬請期待后續的比拼!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM