新聞中心
最近在學習 Kafka,發(fā)現(xiàn)其核心概念與 RocketMQ 還是存在一定的差別,下面我來說下 Kafka 分區(qū) 與 RocketMQ隊列之間的區(qū)別。

RocketMQ 隊列
RocketMQ 每個主題都會有若干個隊列,分布于集群中各個 broker 上,分布規(guī)律如下:
隊列會在 broker 中抽象成一個 consumer queue,在集群模式下,每個隊列每個消費組只能存在一個消費者進行訂閱消費,但是一個消費者可以消費多個隊列,這也保證了在集群模式下消息不會被重復消費,如下圖所示:
在RocketMQ開源版本中,在創(chuàng)建主題時,通過集群創(chuàng)建模式,指定主題在集群中的隊列數(shù)量,比如集群中有 2 個 broker,我們創(chuàng)建主題時選擇隊列數(shù)量為 4,就會在每個 broker 中為該主題創(chuàng)建 4 個 隊列,那么該主題在集群中就會有 4 * 2 個隊列數(shù)量,這里有個不好的地方就是無法精確控制隊列數(shù)量,但這個問題不大。
RocketMQ 是通過主從模式實現(xiàn)消息的冗余,在生產(chǎn)環(huán)境中,也會采取多 Master 多 Slave 模式搭建集群,主從之間的隊列數(shù)據(jù)同步有同步復制和異步復制兩種。
因此,RocketMQ 是依靠隊列進行消費的,而隊列數(shù)據(jù)通過主從同步實現(xiàn)消息的冗余。
Kafka分區(qū)與副本
Kafka 的分區(qū)概念是其核心概念之一,分區(qū)機制使得 Kafka 具備了水平擴展的能力,在其分區(qū)之上,Kafka 還可以設置分區(qū)的副本,大大提高了 Kafka 消息的可靠性。
在 Kafka 中,一個主題在集群中會擁有一個以上分區(qū),每個分區(qū)在每個消費集群中只能有一個消費者進行訂閱消費,,但是一個消費者可以消費多個隊列,與 RocketMQ 隊列一樣:
我們可以通過調(diào)整主題的分區(qū)數(shù)量提高消息的吞吐量,還可以為分區(qū)設置副本因子,即該分區(qū)在集群中擁有多少個副本(replica),副本分為 leader replica 與 follower replica,它們之間通過 ISR(in-sync replica)與 leader replica 保持數(shù)據(jù)同步。
在創(chuàng)建主題topic-demo時,可以指定主題在集群中的分區(qū)數(shù)量,以及副本因子大小:
--partitions 4 --replication-factor 2
以上參數(shù)為該主題創(chuàng)建了 4 個分區(qū),副本因子為 2,我現(xiàn)在有個集群,有 3 個 broker:
nodel brokerid=O
node2 brokerid=l
node3 brokerid=2
根據(jù) 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
有沒有發(fā)現(xiàn),每個分區(qū)都分配了一個副本,而且分區(qū)的分布盡量均衡,分區(qū)副本盡量不在同一個節(jié)點上,如果我們設置副本因子為 3,原理一樣。
不同于 RocketMQ 隊列,Kafka 的分區(qū)可以在集群中精確設置多少個,然后隨機均衡地分布在集群上,還可以自由定義副本的多少,而 RocketMQ 的 Master-Slave 模式看起來僅有一份副本,當然為了節(jié)省存儲空間以及提高性能,一般副本因子設置 2 也就夠了。
相對比 RocketMQ 的隊列與主從同步機制,Kafka 的分區(qū)與副本機制顯得更加靈活,而且也更加合理。
分享標題:Kafka分區(qū)副本與RocketMQ隊列的不同
網(wǎng)頁鏈接:http://m.5511xx.com/article/dpocecp.html


咨詢
建站咨詢
