Kafka分區副本與RocketMQ隊列的區別

微信公衆號「後端進階」,專注後端技術分享:Java、Golang、WEB框架、分佈式中間件、服務治理等等。

最近在學習 Kafka,發現其核心概念與 RocketMQ 還是存在一定的差別,下面我來說下 Kafka 分區 與 RocketMQ 隊列之間的區別。

RocketMQ 隊列

RocketMQ 每個主題都會有若干個隊列,分佈於集羣中各個 broker 上,分佈規律如下:

隊列會在 broker 中抽象成一個 consumer queue,在集羣模式下,每個隊列每個消費組只能存在一個消費者進行訂閱消費,但是一個消費者可以消費多個隊列,這也保證了在集羣模式下消息不會被重複消費,如下圖所示:

在RocketMQ開源版本中,在創建主題時,通過集羣創建模式,指定主題在集羣中的隊列數量,比如集羣中有 2 個 broker,我們創建主題時選擇隊列數量爲 4,就會在每個 broker 中爲該主題創建 4 個 隊列,那麼該主題在集羣中就會有 4 * 2 個隊列數量,這裏有個不好的地方就是無法精確控制隊列數量,但這個問題不大。

RocketMQ 是通過主從模式實現消息的冗餘,在生產環境中,也會採取多 Master 多 Slave 模式搭建集羣,主從之間的隊列數據同步有同步複製和異步複製兩種。

因此,RocketMQ 是依靠隊列進行消費的,而隊列數據通過主從同步實現消息的冗餘。

Kafka分區與副本

Kafka 的分區概念是其核心概念之一,分區機制使得 Kafka 具備了水平擴展的能力,在其分區之上,Kafka 還可以設置分區的副本,大大提高了 Kafka 消息的可靠性。

在 Kafka 中,一個主題在集羣中會擁有一個以上分區,每個分區在每個消費集羣中只能有一個消費者進行訂閱消費,,但是一個消費者可以消費多個隊列,與 RocketMQ 隊列一樣:

我們可以通過調整主題的分區數量提高消息的吞吐量,還可以爲分區設置副本因子,即該分區在集羣中擁有多少個副本(replica),副本分爲 leader replica 與 follower replica,它們之間通過 ISR(in-sync replica)與 leader replica 保持數據同步。

在創建主題topic-demo時,可以指定主題在集羣中的分區數量,以及副本因子大小:

--partitions 4 --replication-factor 2

以上參數爲該主題創建了 4 個分區,副本因子爲 2,我現在有個集羣,有 3 個 broker:

nodel brokerid=O 
node2 brokerid=l 
node3 brokerid=2

根據 Kafka 的默認分配:

node1: topic-demo-0、topic-demo-1
node2: topic-demo-1、topic-demo-2、topic-demo-3
node3: topic-demo-0、topic-demo-2、topic-demo-3

有沒有發現,每個分區都分配了一個副本,而且分區的分佈儘量均衡,分區副本儘量不在同一個節點上,如果我們設置副本因子爲 3,原理一樣。

不同於 RocketMQ 隊列,Kafka 的分區可以在集羣中精確設置多少個,然後隨機均衡地分佈在集羣上,還可以自由定義副本的多少,而 RocketMQ 的 Master-Slave 模式看起來僅有一份副本,當然爲了節省存儲空間以及提高性能,一般副本因子設置 2 也就夠了。

相對比 RocketMQ 的隊列與主從同步機制,Kafka 的分區與副本機制顯得更加靈活,而且也更加合理。

公衆號「後端進階」,專注後端技術分享!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章