溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

kafka工作原理分析怎樣的

發(fā)布時間:2021-12-03 10:40:11 來源:億速云 閱讀:129 作者:柒染 欄目:大數(shù)據(jù)

這篇文章給大家介紹kafka工作原理分析怎樣的,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

1.關(guān)于kafka

Kafka是由Apache軟件基金會開發(fā)的一個開源消息隊列,由Scala和Java編寫。

相關(guān)文章參考:

MQ: 消息隊列常見應(yīng)用場景及主流消息隊列ActiveMQ、RabbitMQ、RocketMQ和Kafka的簡單對比

MQ: kafka的Java接入與入門示例(topic增刪改查,Producer多參發(fā)送,Consumer多分區(qū)接受)

2.工作原理

首先,我們來kafka的整體數(shù)據(jù)流架構(gòu)圖:

kafka工作原理分析怎樣的

2.1.相關(guān)術(shù)語

上圖中,涉及以下術(shù)語:

Producer:消息生產(chǎn)者,生產(chǎn)消息,然后push到消息隊列。

Broker:消息中間人,消息的存儲容器。

Consumer:消息消費者,從消息隊列中pull數(shù)據(jù),進行消費。

Topic:消息話題,消息在業(yè)務(wù)角度的劃分,用于區(qū)分不同種類的消息。

Partition:消息分區(qū),消息在存儲上的邏輯劃分(10條消息,5條存于分區(qū)1,5條存于分區(qū)2),用于加快消息消費速度,提示消息消費吞吐量。

Consumer Group:消息消費者組,可以區(qū)分不同種類的消費者,用于實現(xiàn)點對點模式和發(fā)布訂閱模式。

其他術(shù)語Key、Leader、Replicas、ISR在后續(xù)章節(jié)中逐步介紹。

2.2.消息存儲相關(guān)

想要弄清楚kafka的工作原理,首先應(yīng)該對消息的存儲結(jié)構(gòu)進行掌握。

區(qū)分消息的邏輯概念是話題Topic,Topic存儲于Broker之中,如下圖所示:

kafka工作原理分析怎樣的

為了便于理解,我們直接看圖說話:

Broker與Topic

圖中的Broker集群實際是由3個Broker構(gòu)成的,其實每個Broker就是一個Kafka服務(wù)節(jié)點。

圖中共有3個Topic:橙色為Topic-0,提夫尼藍為Topic-2,深藍色為Topic-1。

Topic與Partition

單看Topic-0-Partition-0:Broker中消息容器的最小單元為Partition,Partition存儲了一條條的消息。

單看Broker-1:

Topic可有多個Partition,如Topic-1有2個分區(qū);若共計9條消息,則可能2個分區(qū)分別存儲了4、5條消息。

Topic可只有1個Partition,如Topic-2;若共計9條消息,則這個單獨的分區(qū)存儲了9條消息。

分區(qū)存儲哪條消息取決于Producer發(fā)送消息時的選擇,相關(guān)內(nèi)容后續(xù)章節(jié)介紹。

多副本冗余機制

單看Topic-2:

粗框Partition表示Leader(主)分區(qū),負責(zé)讀寫消息;

細框Partition表示Replicas(從)分區(qū),被動復(fù)制Leader,復(fù)制冗余容災(zāi)。

如果Broker-1掛掉,則Topic-2-Partition-0的Leader掛掉,從其余兩個Replicas中選舉出新的Leader繼續(xù)提供服務(wù)。

Replicas的數(shù)量不能超過Broker的數(shù)量,因為一個Broker上存在多個Replicas與存在一個Replicas的效果是一樣的。

Replicas的數(shù)量可以小于Broker的數(shù)量。

再看Topic-0:

每個Partition都會有Leader和Replicas。

kafka會盡量打散同一Topic的分區(qū)Leader,如圖,3個Leader分布于3個Broker中。

分區(qū)Leader的分散分布不是絕對的,比方說此時只有一個Broker,則3個分區(qū)都是Leader,都分布在同一個Broker上。

分區(qū)的數(shù)量可以大于Broker的數(shù)量,因為分區(qū)存在的目的是加快消息消費速度,與冗余容災(zāi)無關(guān)。

相對有序性

Topic-0的3個分區(qū)的消息分別是:1、2、3,4、5、6,7、8、9。

Topic-1的2個分區(qū)的消息分別是:1、2、8、9,4、5、6、7。

Topic-2的1個分區(qū)的消息是:1、2、3、4、5、6、7、8、9。

相對有序性:單個partition內(nèi)消息有序,多個partition間消息無序。

kafka通過在Partition中標(biāo)記offset,來記錄消息的順序。

如果業(yè)務(wù)場景追求全局有序性,則每個Topic只配置一個Partition即可。

Producer消息生產(chǎn)語義

消息最多發(fā)送一次:第一種方式:異步發(fā)送消息。第二種方式:同步發(fā)送消息并且重試次數(shù)為0。

消息最少發(fā)送一次:同步發(fā)送消息,失敗與超時重試,知道消息發(fā)送成功。

2.3.消息生產(chǎn)相關(guān)

搞清楚消息的存儲之后,我們再來看消息的生產(chǎn):

kafka工作原理分析怎樣的

為了便于理解,我們直接看圖說話:

①:一個Producer可以向多個Topic、多個Partition發(fā)送消息。

②:多個Producer可以向同一個Topic、同一個Partition發(fā)送消息。

③:消息發(fā)送參數(shù):( topic, [partition], [key], message )

topic必填;message即消息本身,必填。

partition選填。如未填,則判斷key是否存在,若key不存在,則隨機選分區(qū)。

key選填。如填寫,則根據(jù)key哈希之后取模分區(qū)數(shù)量的結(jié)果,選擇分區(qū);如未填,則隨機選分區(qū)。

隨機選分區(qū):優(yōu)先使用緩存的隨機分區(qū);若緩存為空,則隨機選分區(qū),然后將隨機分區(qū)存入緩存,供下次使用。

2.4.消息消費相關(guān)

我們繼續(xù)學(xué)習(xí)消息的消費:

kafka工作原理分析怎樣的

為了便于理解,我們直接看圖說話:

消息消費方式

消息消費的箭頭方向:kafka消費消息的方式只有pull,沒有push。

push的優(yōu)勢在于實時性高,但是容易因Producer生產(chǎn)消息過快壓垮Consumer。

pull的優(yōu)勢在于可以控制消費速度,但是容易出現(xiàn)空輪訓(xùn)。

kafka對pull的優(yōu)化:通過配置使得只有當(dāng)數(shù)據(jù)存在且到達一定量級,才進行pull。

Consumer Group與Consumer

⑥⑦:一個Consumer-Group可以有多個Consumer,也可以只有1個Consumer。

⑤:一個Topic-Partition的消息可以被多個Consumer-Group消費,注意:是Consumer-Group,而不是Consumer。

⑦:若Consumer-Group只有1個Consumer,則這個Partition中的所有消息都被這個Consumer消費。

⑥:若Consumer-Group有多個Consumer,且在正常連接期間:

單個Partition的消息只能被其中一個Consumer消費,不能被Consumer-Group內(nèi)的多個Consumer消費。

多個Partition的消息可以被一個Consumer消費。

若單個Topic的分區(qū)數(shù)量小于Consumer-Group內(nèi)的Consumer個數(shù),則會存在Consumer接受不到這個Topic的消息。

Consumer消息消費語義

消息最多消費一次:1.讀取消息,2,確認offset,3.處理消息。

消息最少消費一次:1.讀取消息,2.處理消息,3.確認offset。

關(guān)于kafka工作原理分析怎樣的就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI