柚子快報(bào)激活碼778899分享:分布式 Kafka基本概念
柚子快報(bào)激活碼778899分享:分布式 Kafka基本概念
目錄
1. 生產(chǎn)者
2. 主題
3. 分區(qū)
4. 消費(fèi)者
5. 消費(fèi)者組
?消費(fèi)者組加入和離開(kāi)消費(fèi)者組流程
1. 消費(fèi)者加入消費(fèi)者組
2. 消費(fèi)者離開(kāi)消費(fèi)者組
批處理
1. 生產(chǎn)者端的批量處理
2. 消費(fèi)者端的批量處理
Kafka是消息中間件的一種,相較于其他消息中間件,其以極高的吞吐量聞名,常用于構(gòu)建實(shí)時(shí)數(shù)據(jù)管道和流應(yīng)用,能夠處理高吞吐量的數(shù)據(jù)流。以下是Kafka中的重要概念:
1. 生產(chǎn)者
生產(chǎn)者是向Kafka主題發(fā)送消息的客戶端。生產(chǎn)者負(fù)責(zé)將Kafka寫(xiě)入數(shù)據(jù),消息的分區(qū)策略(如基于消息鍵、輪詢或自定義分區(qū)邏輯)以及將數(shù)據(jù)寫(xiě)入Kafka的哪個(gè)主題,這些都由生產(chǎn)者的配置決定來(lái)決定。
2. 主題
所有消息中間件都有一種傳輸消息的結(jié)構(gòu),kafka中傳輸消息的結(jié)構(gòu)為主題,消息的傳輸以主題為單位,由生產(chǎn)者將數(shù)據(jù)寫(xiě)入特定的主題,在由消費(fèi)者由特定的主題取出,即可完成一次消息的傳輸。
3. 分區(qū)
為了提高數(shù)據(jù)進(jìn)入主題的速度,Kafka將一個(gè)主題細(xì)分為多個(gè)區(qū),每個(gè)區(qū)都是一個(gè)獨(dú)立的線程,可以獨(dú)立接受生產(chǎn)者生產(chǎn)的消息,這樣大大提高了客戶端向Kafka傳輸數(shù)據(jù)的速度。
4. 消費(fèi)者
消費(fèi)者是從Kafka主題中獲取消息的客戶端。消費(fèi)者通常會(huì)訂閱一個(gè)或多個(gè)主題,然后從中獲取消息并進(jìn)行處理。消費(fèi)者可以獨(dú)立工作,也可以作為消費(fèi)者組的一部分共同消費(fèi)數(shù)據(jù)。
消費(fèi)者從Kafka消費(fèi)數(shù)據(jù)時(shí),獲取完數(shù)據(jù)后,數(shù)據(jù)并不會(huì)消失,消息依舊存儲(chǔ)在Kafka主題中。消費(fèi)者能夠在下一次消費(fèi)時(shí)繼續(xù)消費(fèi)后續(xù)數(shù)據(jù),這是得益于Kafka內(nèi)部維護(hù)的特殊主題__consumer_offsets,該主題記錄了每個(gè)消費(fèi)者組的分區(qū)和其偏移量之間的關(guān)系(單個(gè)獨(dú)立的消費(fèi)者自己屬于一個(gè)消費(fèi)者組)。在每次消費(fèi)之前,消費(fèi)者會(huì)從__consumer_offsets主題中查找自己所屬的消費(fèi)者組的分區(qū)的偏移量,并從對(duì)應(yīng)的位置開(kāi)始消費(fèi)。消費(fèi)完成后,消費(fèi)者會(huì)更新這些偏移量并提交到__consumer_offsets主題中。
這也意味著多個(gè)消費(fèi)者組可以同時(shí)消費(fèi)同一個(gè)主題而互不干擾,因?yàn)槊總€(gè)消費(fèi)者組在__consumer_offsets主題中都有獨(dú)立的偏移量記錄。因此,即使多個(gè)消費(fèi)者組同時(shí)消費(fèi)同一主題,它們也不會(huì)相互影響,各自消費(fèi)的數(shù)據(jù)流是獨(dú)立的。
偏移量是消息在分區(qū)中的唯一標(biāo)識(shí)符。每個(gè)分區(qū)內(nèi)的消息都有一個(gè)連續(xù)的偏移量,當(dāng)消費(fèi)者從分區(qū)中拉取消息時(shí),它會(huì)記錄已經(jīng)消費(fèi)到的最新偏移量,確保下一次消費(fèi)時(shí)能夠繼續(xù)從上次的位置開(kāi)始。
5. 消費(fèi)者組
Kafka通過(guò)分區(qū)提高一個(gè)主題數(shù)據(jù)寫(xiě)入的速度,而消費(fèi)者組則是Kafka用來(lái)提高數(shù)據(jù)獲取速度的手段,消費(fèi)者組通過(guò)建立一個(gè)多個(gè)消費(fèi)者的組通過(guò)使用__consumer_offsets主題中同一個(gè)偏移量,共同消費(fèi)一個(gè)主題,以提高數(shù)據(jù)消費(fèi)的速度。
?消費(fèi)者組加入和離開(kāi)消費(fèi)者組流程
1. 消費(fèi)者加入消費(fèi)者組
新消費(fèi)者實(shí)例啟動(dòng):一個(gè)新的消費(fèi)者實(shí)例啟動(dòng),并使用與現(xiàn)有消費(fèi)者相同的group.id(即消費(fèi)者組ID)。這個(gè)新消費(fèi)者會(huì)向Kafka的消費(fèi)者組協(xié)調(diào)器發(fā)送一個(gè)加入請(qǐng)求,表明它想加入這個(gè)消費(fèi)者組。分區(qū)重新平衡:一旦新的消費(fèi)者加入,消費(fèi)者組內(nèi)的所有分區(qū)可能會(huì)被重新分配。Kafka會(huì)嘗試將主題的分區(qū)在消費(fèi)者組中的所有消費(fèi)者之間重新分配,以平衡負(fù)載。例如,如果一個(gè)消費(fèi)者組有6個(gè)分區(qū),原本有2個(gè)消費(fèi)者在處理這些分區(qū),Kafka的消費(fèi)者組協(xié)調(diào)器會(huì)將每三個(gè)分區(qū)分配給一個(gè)消費(fèi)者,當(dāng)加入一個(gè)新的消費(fèi)者后,這6個(gè)分區(qū)就會(huì)被重新分配到3個(gè)消費(fèi)者,每個(gè)消費(fèi)者處理2個(gè)分區(qū)。新的分配通知:重新平衡后,消費(fèi)者組協(xié)調(diào)器會(huì)通知每個(gè)消費(fèi)者它現(xiàn)在負(fù)責(zé)的分區(qū)。新加入的消費(fèi)者會(huì)開(kāi)始從它被分配到的分區(qū)中消費(fèi)消息。
2. 消費(fèi)者離開(kāi)消費(fèi)者組
消費(fèi)者實(shí)例停止:一個(gè)消費(fèi)者實(shí)例停止運(yùn)行、崩潰、或由于網(wǎng)絡(luò)問(wèn)題與Kafka斷開(kāi)連接。此時(shí),該消費(fèi)者將離開(kāi)消費(fèi)者組。分區(qū)重新分配:消費(fèi)者離開(kāi)消費(fèi)者組后,消費(fèi)者組協(xié)調(diào)器會(huì)觸發(fā)重新平衡過(guò)程,將離開(kāi)消費(fèi)者原本負(fù)責(zé)的分區(qū)重新分配給剩余的消費(fèi)者。這確保了所有分區(qū)都有消費(fèi)者來(lái)處理。其他消費(fèi)者的負(fù)載增加:重新平衡后,剩下的消費(fèi)者會(huì)接手離開(kāi)消費(fèi)者的分區(qū),從而增加它們的處理負(fù)載。
Kafka通過(guò)分區(qū)和消費(fèi)者組大大提高了數(shù)據(jù)寫(xiě)入和讀取的速度,除了提高并發(fā)以外,吞吐量的提高還要關(guān)注帶寬和磁盤(pán)IO速率,如果網(wǎng)絡(luò)傳輸數(shù)據(jù)或磁盤(pán)存取的速度不夠快,即使并發(fā)量再多,也無(wú)法提高性能。但是這兩者屬于客觀因素,kafka本身不能控制,那么kafka如何在固定帶寬和磁盤(pán)IO速率的情況下,傳輸更多的數(shù)據(jù)呢?答案是批處理。
批處理
Kafka為了提高吞吐量,通常會(huì)使用**批量處理(batching)**的方式來(lái)發(fā)送和接收消息。這種機(jī)制在生產(chǎn)者和消費(fèi)者兩端都有體現(xiàn)。下面詳細(xì)解釋一下這種機(jī)制以及它如何提高Kafka的吞吐量。
1. 生產(chǎn)者端的批量處理
當(dāng)生產(chǎn)者發(fā)送消息時(shí),Kafka允許生產(chǎn)者將多個(gè)消息批量打包在一起,然后作為一個(gè)單元發(fā)送到Kafka。生產(chǎn)者會(huì)將消息暫時(shí)存儲(chǔ)在一個(gè)緩沖區(qū)中,當(dāng)緩沖區(qū)達(dá)到一定的大小(由配置參數(shù)決定),或者等待時(shí)間達(dá)到一個(gè)預(yù)設(shè)的閾值時(shí)(如配置的linger.ms參數(shù)),生產(chǎn)者會(huì)將緩沖區(qū)中的消息打包成一個(gè)批次,發(fā)送到Kafka broker。
通過(guò)這種方式,消息一次性發(fā)送到服務(wù)器,節(jié)省了網(wǎng)絡(luò)請(qǐng)求次數(shù),也節(jié)省了磁盤(pán)IO過(guò)程中的系統(tǒng)調(diào)用次數(shù),提高了Kafka的性能。
2. 消費(fèi)者端的批量處理
在消費(fèi)者端,Kafka同樣允許消費(fèi)者批量拉取消息,即每次從Kafka broker獲取一批消息,而不是每次只獲取一條消費(fèi)者可以設(shè)置每次拉取的消息數(shù)量上限,從而在單次請(qǐng)求中獲得多個(gè)消息。
消費(fèi)者批量拉取數(shù)據(jù)同樣節(jié)省網(wǎng)絡(luò)請(qǐng)求次數(shù),節(jié)省磁盤(pán)IO過(guò)程中的系統(tǒng)調(diào)用。
批量處理雖然能夠顯著提高吞吐量,但也引入了一定的延遲。例如,如果生產(chǎn)者為了等待更多的消息來(lái)填滿批次而延遲發(fā)送,那么這段等待時(shí)間會(huì)引入額外的延遲。實(shí)際生產(chǎn)過(guò)程中需要開(kāi)發(fā)者自行調(diào)整配置,權(quán)衡性能和延遲。
Kafka性能非常優(yōu)越,但這也意味著它會(huì)消耗大量的資源,包括帶寬、內(nèi)存、CPU和磁盤(pán)資源。由于Kafka的復(fù)雜性和高性能需求,它的運(yùn)維難度較大,運(yùn)維人員需要在實(shí)際服務(wù)器環(huán)境中進(jìn)行配置調(diào)整,以適應(yīng)具體的使用場(chǎng)景和環(huán)境。
柚子快報(bào)激活碼778899分享:分布式 Kafka基本概念
相關(guān)閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。