Kafka的topic爲何要分區。面試
消費者組的做用。
markdown
Kafka分區分配。架構
再睜眼的瞬間, 畫風竟然變成了植物大戰殭屍的樣子!!!分佈式
下面咱們來講道說道這有趣的場景:spa
咱們熟悉的消息生產者——天然就是植物大戰殭屍中能夠生成糧食的植物了。3d
好比生產者豌豆射手:code
他能夠發送出普通豌豆(消息)。orm
好比生產者寒冰射手:
遊戲
他能夠發送出寒冰豌豆(消息)。kafka
再來看看咱們可愛的消費者殭屍,他們能夠消耗(消費)生產者發出來的豌豆(消息)。
Kafka炮臺支持兩種豌豆投遞方式。
把消費者殭屍劃分紅不一樣的消費者組,那麼就能夠實現點對點模式和廣播模式。
生產者有不少類型,有普通豌豆射手,有寒冰射手,有火焰射手等等,這些生產者發出來的豌豆就分別對應3個Topic:普通主題,寒冰主題, 火焰主題。
不少不一樣類型生產者其實均可以生產普通豌豆,好比二連豌豆,三連豌豆,加特林豌豆(四連發),甚至還有能夠五連發的豌豆莢。
若是如今戰場上投入一批五連發的豌豆莢!
能夠預見的是,將會有巨量的普通豌豆發送到普通主題炮臺中,很快這個炮臺就會積壓不少豌豆發送不出去,而且還有可能由於負載過大而宕機,而與此造成鮮明對比的是,其餘主題的炮臺倒是處於空閒狀態,連一顆寒冰/火焰豌豆都接收不到。
而站在消費組殭屍的角度上看,即便如今新增再多的消費者,也沒法加速豌豆的消耗,由於Kafka炮臺已經成爲吞吐量的瓶頸。
若是咱們讓每一個炮臺均可以接收多種主題的豌豆, 這樣就能夠充分利用場上的每個炮臺了。這就是主題的分區。
假如如今咱們給普通豌豆主題2個分區, 這2個分區分別分佈在兩個炮臺中。
這樣場上全部炮臺能夠接收普通豌豆子彈,理想狀態下,是能夠減緩了單一炮臺的壓力,這就是主題分區的特色之一,分佈式存儲。
而對於消費者殭屍而言,如今同一時間能夠有兩個消費者殭屍消耗普通豌豆, 加快了豌豆的消耗速度,這主題分區的另外一個特色,分佈式消費。
如今主題有了分區,在得到了不少好處的同時,又必然會引伸出一系列複雜的問題。
全部如今生產者要考慮怎麼才能把豌豆均勻地分發給各個Kafka炮臺。
在Kafka中,若是生產者有指定分區號,那麼消息會直接發往指定的分區。不然會提供默認的分區器DefaultPartitioner,對消息的key進行哈希運算獲得分區號。若是消息沒有key,那麼就會採用輪詢的方式給主題下的各個分區發送消息。
如圖,若是兩個分區的豌豆都由同一個消費者殭屍負責消耗,另外一個消費者將無所事事,這就是消費者分區分配不均的狀況。
因此,消費者殭屍也要討論由哪些殭屍負責消耗哪些分區的豌豆,讓每一個殭屍均可以均勻地承受打擊。
Kafka提供的消費者分區分配策略有三種,分別是RangeAssignor、RoundRobinAssignor和StickyAssignor。每種策略的具體細節屬於殭屍大軍中的「高度機密」(面試高頻),咱們將在下一篇文章中進行講解。
思考一下,若是一個生產者把全部豌豆發送給炮臺存儲後,炮臺宕機了,那這批豌豆就丟失了,那怎麼才能避免這問題呢?這就是數據的容災能力問題了。
咱們給每一個主題的分區引入副本的概念。
若是每個分區都有2個副本,副本之間的關係是一個Leader對多個follower。
只有Leader副本才能存儲豌豆,其餘副本只是同步Leader的數據。
若是Leader宕機了,那麼就會在剩下的副本中選出新的Leader。這就實現了故障的自動轉移。
Kafka集羣在建立主題時,就要考慮分區副本應該分配在哪一個broker上。
而引入副本機制後,與此相關的優先副本選舉,副本之間的同步機制等問題又是一次長篇大論了。
ZooKeeper的做用。
分區的有序性。
分區數。
重平衡。