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

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

最近在學習 Kafka,發現其核心概念與 RocketMQ 仍是存在必定的差異,下面我來講下 Kafka 分區與 RocketMQ 隊列之間的區別。後端

RocketMQ 隊列

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

隊列會在 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 保持數據同步。spa

在建立主題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-一、topic-demo-二、topic-demo-3
node3: topic-demo-0、topic-demo-二、topic-demo-3
複製代碼

有沒有發現,每一個分區都分配了一個副本,並且分區的分佈儘可能均衡,分區副本儘可能不在同一個節點上,若是咱們設置副本因子爲 3,原理同樣。

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

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

公衆號「後端進階」,專一後端技術分享!
相關文章
相關標籤/搜索