天天看點

Kafka vs RocketMQ——單機系統可靠性

前幾期的評測中,我們對比了kafka和rocketmq的吞吐量和穩定性,本期我們要引入一個新的評測标準——軟體可靠性。

何為<code>“可靠性”</code>?

先看下面這種情況:有a,b兩輛越野汽車,在城市的周邊地區均能很好應對泥濘的路況。當一同開去穿越西藏,a車會因為西藏本地的汽油不達标,導緻油路受阻無法點火,而b車順利完成了穿越。是以我們說,b車的可靠性比a車高。

何為<code>“軟體可靠性”</code>?

“軟體的可靠性”就是考察軟體在各種異常突發的情況下的應對能力。常見的軟體異常有:磁盤損壞、程序意外退出、主控端當機等情況。

何為<code>“消息中間件的可靠性”</code>?

對于消息中間件來說,“可靠性”最直接的名額就是——消息資料不丢失。此外,消息不重投、服務一主多備等特性也可以用來評估可靠性。

那麼kafka和rocketmq(以下簡稱rmq)在可靠性上孰優孰劣呢?和我們走進本期的測試比拼吧!

在消息收發的過程中,分别模拟broker服務程序被kill、實體機器掉電的異常場景,多次實驗,檢視極端情況下消息系統的可靠性。

以下場景使用多個發送端向一個topic發送消息,發送方式為同步發送,分區數為8,隻啟動一個訂閱者。

在消息收發過程中,利用kill -9 指令使broker程序終止,然後重新啟動,得到可靠性資料如下:

Kafka vs RocketMQ——單機系統可靠性

注:以上測試場景中kafka的異步刷盤間隔為1秒鐘,同步發送需設定request.required.acks=1,否則會出現消息丢失。

在broker程序被終止重新開機,kafka和rmq都能保證同步發送的消息不丢,因為程序退出後作業系統能確定将該程序遺留在記憶體的資料刷到磁盤上。實驗中,kafka出現了極少量的消息重複。再次可以确定此場景中,二者的可靠性都很高。

在消息收發過程中,直接拔掉broker所在的主控端電源,然後重新開機主控端和broker應用。因受到機房斷電限制,我們在本場景測試中使用的是普通pc機器。得到可靠性資料如下:

Kafka vs RocketMQ——單機系統可靠性

測試發現,即使在并發很低的情況下,kafka和rmq都無法保證掉電後不丢消息。這個時候,就需要改變刷盤政策了。我們把刷盤政策由“異步刷盤”變更為“同步刷盤”,就是說,讓每一條消息都完成存儲後才傳回,以保證消息不丢失。

注:關于兩種刷盤模式的詳細差別可以參照文檔最下方的說明

重新執行上面的測試,得到資料如下:

Kafka vs RocketMQ——單機系統可靠性

首先,設定同步刷盤時,二者都沒出現消息丢失的情況。限于我們使用的是普通pc機器,兩者吞吐量都不高。此時kafka的最高tps僅有500條/秒,rmq可以達到4000條/秒,已經是kafka的8倍。

為什麼kafka的吞吐量如此低呢?因為kafka本身是沒有實作任何同步刷盤機制的,就是說在這種場景下測試,kafka注定是要丢消息的。但要想做到每一條消息都在落盤後才傳回,我們可以通過修改異步刷盤的頻率來實作。設定參數log.flush.interval.messages=1,即每條消息都刷一次磁盤。這樣的做法,kafka也不會丢消息了,但是頻繁的磁盤讀寫直接導緻性能的下降。

另外,二者在服務恢複後,均出現了消息重複消費的情況,這說明消費位點的送出并不是同步落盤的。不過,幸好kafka和rmq都提供了自定義消費位點的接口,來避免大量的重複消費。

**1. 在broker程序被kill的場景, kafka和rocketmq都能在保證吞吐量的情況下,不丢消息,可靠性都比較高。

在主控端掉電的場景,kafka與rocketmq均能做到不丢消息,此時kafka的吞吐量會急劇下跌,幾乎不可用。rocketmq則仍能保持較高的吞吐量。

<code>在單機可靠性方面,rocketmq綜合表現優于kafka。</code>**

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

Kafka vs RocketMQ——單機系統可靠性

應用版本:

Kafka vs RocketMQ——單機系統可靠性
Kafka vs RocketMQ——單機系統可靠性
Kafka vs RocketMQ——單機系統可靠性

同步刷盤是在每條消息都确認落盤了之後才向發送者傳回響應;而異步刷盤中,隻要消息儲存到broker的記憶體就向發送者傳回響應,broker會有專門的線程對記憶體中的消息進行批量存儲。是以異步刷盤的政策下,當機器突然掉電時,broker記憶體中的消息因無法刷到磁盤導緻丢失。

本期測試中,rocketmq比kafka具有更高的單機可靠性。對于普通業務,部署異步刷盤模式可以得到更高的性能;對于丢消息零容忍的業務,則更适用rocketmq同步刷盤的模式,在享受高可靠性保障的同時,又能擁有較高的吞吐量。

實際上,單機可靠性隻是軟體可靠性測試的一個環節,kafka和rocketmq都提供了主備機模式,來解決伺服器的單點故障。這點我們在後續會繼續實驗摸索,敬請期待接下來的比拼!

<a href="https://yq.aliyun.com/articles/62831?spm=5176.8091938.0.0.8ckml2">kafka、rabbitmq、rocketmq發送小消息性能對比</a>

<a href="https://yq.aliyun.com/articles/62832?spm=5176.8091938.0.0.ugjine">kafka vs rocketmq——topic數量對單機性能的影響</a>

<a href="http://www.atatech.org/articles/46403">kafka vs rocketmq—— 多topic對性能穩定性的影響</a>

<a href="https://yq.aliyun.com/articles/62834?spm=5176.8091938.0.0.nezyrn">業界主流mq對比</a>

<a href="https://yq.aliyun.com/articles/62836?spm=5176.8091938.0.0.zj8hp5">kafka vs rocketmq——消息及時性對比</a>

繼續閱讀