Kafka 消費(fèi)者組
Kafka 消費(fèi)者組
Consumer Group 是kafka 當(dāng)中比較有亮點(diǎn)的設(shè)計(jì)了。
1. 消費(fèi)者組的特點(diǎn):

一個(gè)分區(qū)只可以被消費(fèi)組中的一個(gè)消費(fèi)者所消費(fèi)。
一個(gè)消費(fèi)組中的一個(gè)消費(fèi)者可以消費(fèi)多個(gè)分區(qū),例如?
C1
?消費(fèi)了?P0, P3
。
一個(gè)消費(fèi)組中的不同消費(fèi)者消費(fèi)的分區(qū)一定不會(huì)重復(fù),例如:
C1 -> P0、P3
C2 -> P1、P2
所有消費(fèi)者一起消費(fèi)所有的分區(qū),例如?C1
?和?C2
?共同完成了對?P0、P1、P2、P3
?的消費(fèi)。
在不同消費(fèi)組中,每個(gè)消費(fèi)組都會(huì)消費(fèi)所有的分區(qū),例如,消費(fèi)組A、消費(fèi)組B 都消費(fèi)了?P0、P1、P2、P3
。
同一個(gè)消費(fèi)組里面的消費(fèi)者對分區(qū)是互斥的,例如?C1 和 C2
?不會(huì)消費(fèi)同一個(gè)分區(qū);而分區(qū)在不同的消費(fèi)組間是共享的。
2. 消費(fèi)者組的優(yōu)勢
高性能

假設(shè)一個(gè)主題有10個(gè)分區(qū),如果沒有消費(fèi)者組,只有一個(gè)消費(fèi)者對這10個(gè)分區(qū)消費(fèi),他的壓力肯定大。

如果有了消費(fèi)者組,組內(nèi)的成員就可以分擔(dān)這10個(gè)分區(qū)的壓力,提高消費(fèi)性能。
消費(fèi)模式靈活
假設(shè)有4個(gè)消費(fèi)者訂閱一個(gè)主題,不同的組合方式就可以形成不同的消費(fèi)模式。

只使用一個(gè)消費(fèi)者組,把4個(gè)消費(fèi)者都放在一起,利用分區(qū)在組內(nèi)成員間互斥的特性,就實(shí)現(xiàn)了單播(隊(duì)列)模式。
故障容災(zāi)
如果只有一個(gè)消費(fèi)者,出現(xiàn)故障后就比較麻煩了,但有了消費(fèi)者組之后就方便多了。
消費(fèi)組會(huì)對其成員進(jìn)行管理,在有消費(fèi)者加入或者退出后,消費(fèi)者成員列表發(fā)生變化,消費(fèi)組就會(huì)執(zhí)行再平衡的操作。
例如一個(gè)消費(fèi)者宕機(jī)后,之前分配給他的分區(qū)會(huì)重新分配給其他的消費(fèi)者,實(shí)現(xiàn)消費(fèi)者的故障容錯(cuò)。
消費(fèi)者組的好處:
消費(fèi)效率更高
消費(fèi)模式靈活
便于故障容災(zāi)
Consumer Group 是 Kafka 提供的可擴(kuò)展且具有容錯(cuò)性的消費(fèi)者機(jī)制。
Consumer Group 下可以有一個(gè)或多個(gè) Consumer 實(shí)例。
Group ID 是一個(gè)字符串,在一個(gè) Kafka 集群中,它標(biāo)識(shí)唯一的一個(gè) Consumer Group。
Consumer Group 下所有實(shí)例訂閱的主題的單個(gè)分區(qū),只能分配給組內(nèi)的某個(gè) Consumer 實(shí)例消費(fèi)。這個(gè)分區(qū)當(dāng)然也可以被其他的 Group 消費(fèi)。
一般的消息隊(duì)列模型
傳統(tǒng)點(diǎn)對點(diǎn)模型是消息一旦被消費(fèi),就會(huì)從隊(duì)列中被刪除,而且只能被下游的一個(gè) Consumer 消費(fèi)。這既是特性,也是一種伸縮性比較差的缺陷。
傳統(tǒng)發(fā)布/訂閱模型允許消息被多個(gè) Consumer 消費(fèi),但它的問題也是伸縮性不高,因?yàn)槊總€(gè)訂閱者都必須要訂閱消費(fèi)主題的所有分區(qū)。
Kafka的消費(fèi)者組解決的問題
Kafka使用 Consumer Group 這一種機(jī)制,可以實(shí)現(xiàn)了傳統(tǒng)消息引擎系統(tǒng)的兩大模型。如果所有實(shí)例都屬于同一個(gè) Group,那么它實(shí)現(xiàn)的就是消息隊(duì)列模型;如果所有實(shí)例分別屬于不同的 Group,那么它實(shí)現(xiàn)的就是發(fā)布 / 訂閱模型。
除此以外,因?yàn)橥瑐€(gè)消費(fèi)組多個(gè)消費(fèi)者實(shí)例共同分擔(dān)消費(fèi)各個(gè)Topic分區(qū),也就提高了伸縮性。
理想情況下,Consumer 實(shí)例的數(shù)量應(yīng)該等于該 Group 訂閱主題的分區(qū)總數(shù),這樣每個(gè)Consumer實(shí)例理想情況都會(huì)分擔(dān)一個(gè)分區(qū)都消費(fèi)任務(wù),也不會(huì)造成資源浪費(fèi)(犧牲可用性)。
Kafka消費(fèi)位移
針對 Consumer Group,Kafka 是怎么管理位移的呢?
消費(fèi)者在消費(fèi)的過程中需要記錄自己消費(fèi)了多少數(shù)據(jù),即消費(fèi)位置信息。在 Kafka 中,這個(gè)位置信息有個(gè)專門的術(shù)語:位移(Offset)。
新老版本差異:
老版本的 Consumer Group 把位移保存在 ZooKeeper 中。將位移保存在 ZooKeeper 外部系統(tǒng)的做法,最顯而易見的好處就是減少了 Kafka Broker 端的狀態(tài)保存開銷。缺點(diǎn):ZooKeeper 這類元框架其實(shí)并不適合進(jìn)行頻繁的寫更新,而 Consumer Group 的位移更新卻是一個(gè)非常頻繁的操作。這種大吞吐量的寫操作會(huì)極大地拖慢 ZooKeeper 集群的性能。
新版本的 Consumer Group 中,Kafka 社區(qū)重新設(shè)計(jì)了 Consumer Group 的位移管理方式,采用了將位移保存在 Kafka 內(nèi)部主題的方法。這個(gè)內(nèi)部主題就是讓人既愛又恨的?__consumer_offsets。
鏈接:https://www.dianjilingqu.com/480791.html