图解Kafka中的基本概念
本次將學習Kafka中的基本概念。首先我們回顧下在消息系統的使用場景中有三種角色分別是生產者、消息系統和消費者,其中生產者負責產生消息和發送消息到消息系統,而消息系統將為消費者提供消息用于處理,如下圖。
Kafka是基于發布/訂閱模式的消息系統,如下圖。生產者會將消息推送到Kafka中的某個Topic上。引入Topic的目的則是為了對消息進行分類,這樣消費者就可以根據需要訂閱相應的Topic獲取消息。
雖然Kafka這樣已經能開始工作了,但緊接著又面臨單點問題。而為了解決單點問題,Kafka引入了Broker的概念。
一個Broker是一個Kafka實例,而一臺機器上可運行多個Broker,這里我們認為一臺機器上只有一個Kafka實例。多個Broker將形成一個Kafka集群,而Topic也可指定副本數量,作為多個副本位于多臺機器上。
Kafka使用ZooKeeper在多個副本中選舉出一個Leader,其他副本將作為Follower。Leaer主要負責讀寫消息,也就是和生產者、消費者打交道,同時將消息同步寫到其他副本中。
當有Broker失效時,如果Topic沒有了Leader,則會重新選舉出新的Leader,從而解決單點問題。
引入Broker和副本后解決了單點問題,接著面對的是性能問題,對于單個Topic來說,只有Leader所在的Broker與生產者、消費者進行通信,這樣吞吐量將受到Broker所在的機器限制。
那么如何提高吞吐量。Kafka將Topic拆分成多個分區,也就是將消息進行劃分,類似數據庫的分庫,這樣起到了負載均衡的作用,可不受單機的限制。如下圖,生產者A分別往TopicA的分區0和分區1寫消息,而消費者A、B則也從分區0、1獲取消息。
這里注意下,在不同分區存儲的消息也是不同的,和副本的概念要分清楚。
從上圖中我們可看到消費者A在消費TopicA時分別從分區0、分區1中獲取消息,為了進一步提高吞吐量,Kafka引入了消費組的概念,將消費者A拆分成多個消費者,從而形成一個消費組。
我們可以這樣理解,消費者A是一個應用A實例,為了提高消費的吞吐量,我們多部署了幾個消費者A實例,這樣就有多個消費者形成一個消費組,但干的都是應用A做的事,需要與消費者B(不同的應用)區分開。
一般設置消費組的消費者數與分區數一致,這是為了一個消費者能負責一個分區,提高效率。如果消費組的消費者數量小于分區數,則會出現一個消費者負責多個分區。
而如果消費組的消費者數量大于分區數,則會出現有消費者分不到分區,造成浪費。
所以一般保持一致。為了簡潔,且消費組B和消費組A類似,所以下圖未將消費組B畫出。
Kafka中的基本概念就是以上這些:生產者、消費者、Topic、Broker、副本、分區和消息組。最后為了大家更好的理解分區的概念,再畫一張細節圖。
一個分區可以看做是一個單獨的隊列,生產者根據策略將消息寫入對于的分區,策略有三種:
一、直接指定分區;
二、如果未指定分區,則根據消息的key,通過哈希函數指定分區;
三、如果沒有key,則輪詢分區。這里想強調的是分區中的數據是不同的,一條消息只會進入一個分區。而消費組中的消費者則會根據偏移量去分區中取得相應的消息進行消費處理。
有道無術,術可成;有術無道,止于術
歡迎大家關注Java之道公眾號
好文章,我在看??
總結
以上是生活随笔為你收集整理的图解Kafka中的基本概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 定义一个接口CanFly,描述会飞的方法
- 下一篇: [1-2] Dependence-Awa