Kafka、RabbitMQ、RocketMQ訊息中介軟體的對比
引言
分散式系統中,我們廣泛運用訊息中介軟體進行系統間的資料交換,便於非同步解耦。現在開源的訊息中介軟體有很多,前段時間我們自家的產品 RocketMQ (MetaQ的核心) 也順利開源,得到大家的關注。
那麼,訊息中介軟體效能究竟哪家強?
帶著這個疑問,我們中介軟體測試組對常見的三類訊息產品(Kafka、RabbitMQ、RocketMQ)做了效能比較。
Kafka是LinkedIn開源的分散式釋出-訂閱訊息系統,目前歸屬於Apache定級專案。Kafka主要特點是基於Pull的模式來處理訊息消費,追求高吞吐量,一開始的目的就是用於日誌收集和傳輸。0.8版本開始支援複製,不支援事務,對訊息的重複、丟失、錯誤沒有嚴格要求,適合產生大量資料的網際網路服務的資料收集業務。
RabbitMQ是使用Erlang語言開發的開源訊息佇列系統,基於AMQP協議來實現。AMQP的主要特徵是面向訊息、佇列、路由(包括點對點和釋出/訂閱)、可靠性、安全。AMQP協議更多用在企業系統內,對資料一致性、穩定性和可靠性要求很高的場景,對效能和吞吐量的要求還在其次。
RocketMQ是阿里開源的訊息中介軟體,它是純Java開發,具有高吞吐量、高可用性、適合大規模分散式系統應用的特點。RocketMQ思路起源於Kafka,但並不是Kafka的一個Copy,它對訊息的可靠傳輸及事務性做了優化,目前在阿里集團被廣泛應用於交易、充值、流計算、訊息推送、日誌流式處理、binglog分發等場景。
測試目的
對比Kafka、RabbitMQ、RocketMQ傳送小訊息(124位元組)的效能。這次壓測我們只關注服務端的效能指標,所以壓測的標準是:
不斷增加發送端的壓力,直到系統吞吐量不再上升,而響應時間拉長。這時服務端已出現效能瓶頸,可以獲得相應的系統最佳吞吐量。
測試場景
在同步傳送場景中,三個訊息中介軟體的表現區分明顯:
Kafka的吞吐量高達17.3w/s,不愧是高吞吐量訊息中介軟體的行業老大。這主要取決於它的佇列模式保證了寫磁碟的過程是線性IO。此時broker磁碟IO已達瓶頸。
RocketMQ也表現不俗,吞吐量在11.6w/s,磁碟IO %util已接近100%。RocketMQ的訊息寫入記憶體後即返回ack,由單獨的執行緒專門做刷盤的操作,所有的訊息均是順序寫檔案。
RabbitMQ的吞吐量5.95w/s,CPU資源消耗較高。它支援AMQP協議,實現非常重量級,為了保證訊息的可靠性在吞吐量上做了取捨。我們還做了RabbitMQ在訊息持久化場景下的效能測試,吞吐量在2.6w/s左右。
測試結論
在服務端處理同步傳送的效能上,Kafka>RocketMQ>RabbitMQ。
附錄:
測試環境
服務端為單機部署,機器配置如下:
應用版本:
測試指令碼
未完待續
前面我們對比了最簡單的小訊息傳送場景,Kafka暫時勝出。但是,作為經受過歷次雙十一洗禮的RocketMQ,在網際網路應用場景中更有它優越的一面。
接下來我們會圍繞分割槽數量、訊息大小、消費形式等不同的影響因子,對三類訊息中介軟體做對比。敬請期待後續報告!