?從這篇文章你將了解到什么侨糟?
Kafka的topic為什么要分區(qū)。
消費者組的作用瘩燥。
Kafka分區(qū)分配秕重。
“Kafka是一個分布式、支持分區(qū)的(partition)厉膀、多副本的(replica)溶耘,基于zookeeper協(xié)調(diào)的分布式消息系統(tǒng)》欤”
看著這一句句對Kafka的介紹凳兵,以及這張架構(gòu)圖, 突然感覺眼前一陣恍惚......
再睜眼的瞬間, 畫風居然變成了植物大戰(zhàn)僵尸的樣子!!!
下面我們來說道說道這有趣的場景:
我們熟悉的消息生產(chǎn)者——自然就是植物大戰(zhàn)僵尸中可以生成糧食的植物了。
比如生產(chǎn)者豌豆射手:
他可以發(fā)送出普通豌豆(消息)企软。
比如生產(chǎn)者寒冰射手:
他可以發(fā)送出寒冰豌豆(消息)庐扫。
再來看看我們可愛的消費者僵尸,他們可以消耗(消費)生產(chǎn)者發(fā)出來的豌豆(消息)澜倦。
而Kafka broker服務(wù)就是一個個炮臺!
炮臺可以儲存豌豆射手發(fā)送過來的豌豆聚蝶, 然后再把這些豌豆投送給僵尸。
ZooKeeper就是僵尸最喜歡的大腦了!
當然這只是一句玩笑藻治,我們消費者僵尸是不會移動的碘勉,也不會去攻擊Zookeeper。
這里要說明一下桩卵,所有消費者僵尸的夢想都是不放過每一顆屬于他的豌豆验靡。他們甚至會主動從炮臺拉取(pull)豌豆過來消耗(消費)。
玩過植物大戰(zhàn)僵尸的小伙伴們都知道雏节,游戲中是沒有Kafka炮臺這種東西的胜嗓。那為什么我們需要Kafka呢?
下面我們來看看,沒有Kafka時钩乍,生產(chǎn)者直接面對消費者僵尸的情況辞州。
1 生產(chǎn)者大戰(zhàn)僵尸
在沒有Kafka的情況下, 豌豆射手(生產(chǎn)者)VS僵尸(消費者)。
豌豆射手要一邊留意僵尸的位置, 一邊費盡全力將豌豆(消息)發(fā)送到僵尸身上!
如果這時候出現(xiàn)一大波新的僵尸!
豌豆射手除了要及時辨認出所有僵尸的位置外, 還要把同一顆豌豆(同一個消息)同時投送給每一個僵尸寥粹。
豌豆射手還要留意投送出去的的豌豆有沒有發(fā)送成功变过,如果一顆豌豆石沉大海,那到底是這個僵尸已經(jīng)掛了涝涤,還是方向射偏了媚狰?同時還要從萬千消費者中找到這個投送失敗的僵尸,重新投送阔拳。
這也太累了吧!
而從僵尸的角度上看呢, 他除了要消耗每一個豌豆, 還要費勁辨認出每一個豌豆射手的位置, 否則的話, 就接不到豌豆射手投出來的豌豆了!
隨著生產(chǎn)者和消費者的增多崭孤,他們之間的關(guān)系也就越來越混亂。這樣一來, 不僅豌豆射手累, 僵尸也累!
2 Kafka大戰(zhàn)僵尸
如果在豌豆射手和僵尸之間加上一個Kafka炮臺(kafka broker)會怎么樣呢?
現(xiàn)在豌豆射手只需要關(guān)心Kafka炮臺的位置, 然后把豌豆發(fā)送給Kafka炮臺存儲起來。豌豆射手不用再關(guān)心有多少個消費者僵尸, 只要一心一意地生產(chǎn)豌豆就好, 多舒心!
而消費者僵尸呢辨宠, 同樣也不需要關(guān)心有多少生產(chǎn)者遗锣,只需要記住Kafka炮臺的位置,專心消耗豌豆就行彭羹。
Kafka的使用場景之一就是解耦生產(chǎn)者和消費者黄伊,生產(chǎn)者和消費者不再直接接觸。
消費者組
Kafka炮臺支持兩種豌豆投遞方式派殷。
把消費者僵尸劃分成不同的消費者組还最,那么就可以實現(xiàn)點對點模式和廣播模式。
如果每個消費者僵尸屬于不同的消費組毡惜,那么同一顆豌豆會被“廣播”給每個消費組內(nèi)的僵尸拓轻。
如果每個消費者僵尸都在同一個消費組,那么同一顆豌豆经伙,每一個消費組內(nèi)只能有一個僵尸能消耗這顆豌豆扶叉。
主題與訂閱
生產(chǎn)者有很多類型,有普通豌豆射手帕膜,有寒冰射手枣氧,有火焰射手等等,這些生產(chǎn)者發(fā)出來的豌豆就分別對應(yīng)3個Topic:普通主題垮刹,寒冰主題达吞, 火焰主題。
主題如果沒有分區(qū)荒典,那么就意味著每個炮臺只能接收一種主題的豌豆酪劫。
如果一個炮臺接收了寒冰豌豆,那么他就不能再接收普通豌豆寺董。
消費者僵尸也有很多種類型覆糟,寒冰僵尸擅長消耗寒冰豌豆,火焰抗性高的僵尸擅長消耗火焰豌豆遮咖。
不同的消費者僵尸會主動從Kafka炮臺“訂閱”自己感興趣的主題滩字。比如寒冰僵尸會專門去消耗寒冰豌豆,普通僵尸會專門去消耗普通豌豆御吞。
主題沒有分區(qū)的弊端
很多不同類型生產(chǎn)者其實都可以生產(chǎn)普通豌豆踢械,比如二連豌豆,三連豌豆魄藕,加特林豌豆(四連發(fā)),甚至還有可以五連發(fā)的豌豆莢撵术。
如果現(xiàn)在戰(zhàn)場上投入一批五連發(fā)的豌豆莢背率!
可以預(yù)見的是,將會有巨量的普通豌豆發(fā)送到普通主題炮臺中,很快這個炮臺就會積壓很多豌豆發(fā)送不出去寝姿,并且還有可能因為負載過大而宕機交排,而與此形成鮮明對比的是,其他主題的炮臺卻是處于空閑狀態(tài)饵筑,連一顆寒冰/火焰豌豆都接收不到埃篓。
而站在消費組僵尸的角度上看,即使現(xiàn)在新增再多的消費者根资,也無法加速豌豆的消耗架专,因為Kafka炮臺已經(jīng)成為吞吐量的瓶頸。
3 主題分區(qū)
如果我們讓每個炮臺都可以接收多種主題的豌豆, 這樣就可以充分利用場上的每一個炮臺了玄帕。這就是主題的分區(qū)部脚。
假如現(xiàn)在我們給普通豌豆主題2個分區(qū), 這2個分區(qū)分別分布在兩個炮臺中裤纹。
這樣場上所有炮臺可以接收普通豌豆子彈委刘,理想狀態(tài)下,是可以減緩了單一炮臺的壓力鹰椒,這就是主題分區(qū)的特點之一锡移,分布式存儲。
而對于消費者僵尸而言漆际,現(xiàn)在同一時間可以有兩個消費者僵尸消耗普通豌豆淆珊, 加快了豌豆的消耗速度,這主題分區(qū)的另一個特點灿椅,分布式消費套蒂。
4 分區(qū)分配
現(xiàn)在主題有了分區(qū),在獲得了很多好處的同時茫蛹,又必然會引申出一系列復(fù)雜的問題操刀。
生產(chǎn)者的分區(qū)分配
如圖,如果豌豆莢每次給主題分區(qū)1和分區(qū)2按4:1的比例發(fā)放豌豆婴洼,那么最后還是會導(dǎo)致分區(qū)1所在的Kafka炮臺負擔過重骨坑。
所有現(xiàn)在生產(chǎn)者要考慮怎么才能把豌豆均勻地分發(fā)給各個Kafka炮臺。
在Kafka中柬采,如果生產(chǎn)者有指定分區(qū)號欢唾,那么消息會直接發(fā)往指定的分區(qū)。否則會提供默認的分區(qū)器DefaultPartitioner粉捻,對消息的key進行哈希運算得到分區(qū)號礁遣。如果消息沒有key,那么就會采用輪詢的方式給主題下的各個分區(qū)發(fā)送消息肩刃。
消費者的分區(qū)分配
如圖祟霍,如果兩個分區(qū)的豌豆都由同一個消費者僵尸負責消耗杏头,另一個消費者將無所事事,這就是消費者分區(qū)分配不均的情況沸呐。
所以醇王,消費者僵尸也要討論由哪些僵尸負責消耗哪些分區(qū)的豌豆,讓每個僵尸都可以均勻地承受打擊崭添。
Kafka提供的消費者分區(qū)分配策略有三種寓娩,分別是RangeAssignor、RoundRobinAssignor和StickyAssignor呼渣。每種策略的具體細節(jié)屬于僵尸大軍中的“高度機密”(面試高頻)棘伴,我們將在下一篇文章中進行講解。
broker端的分區(qū)分配
思考一下徙邻,如果一個生產(chǎn)者把所有豌豆發(fā)送給炮臺存儲后排嫌,炮臺宕機了,那這批豌豆就丟失了缰犁,那怎么才能避免這問題呢淳地?這就是數(shù)據(jù)的容災(zāi)能力問題了。
我們給每個主題的分區(qū)引入副本的概念帅容。
如果每一個分區(qū)都有2個副本颇象,副本之間的關(guān)系是一個Leader對多個follower。
只有Leader副本才能存儲豌豆并徘,其他副本只是同步Leader的數(shù)據(jù)遣钳。
如果Leader宕機了,那么就會在剩下的副本中選出新的Leader麦乞。這就實現(xiàn)了故障的自動轉(zhuǎn)移蕴茴。
Kafka集群在創(chuàng)建主題時,就要考慮分區(qū)副本應(yīng)該分配在哪個broker上姐直。
而引入副本機制后倦淀,與此相關(guān)的優(yōu)先副本選舉,副本之間的同步機制等問題又是一次長篇大論了声畏。
5 后續(xù)
由于篇幅有限撞叽,很多沒有提及的問題,就留到下一篇再講解了插龄。
ZooKeeper的作用愿棋。
分區(qū)的有序性。
分區(qū)數(shù)均牢。
重平衡糠雨。