Kafka:介紹和內(nèi)部工作原理
展示Kafka工作方式的簡(jiǎn)單架構(gòu)。
什么是Kafka?為什么我們要使用它?它是消息隊(duì)列嗎?
它是一個(gè) 分布式流處理平臺(tái)或分布式 提交日志。
Kafka通常用于實(shí)時(shí)流數(shù)據(jù)管道,即在系統(tǒng)之間傳輸數(shù)據(jù),構(gòu)建不斷流動(dòng)的數(shù)據(jù)轉(zhuǎn)換系統(tǒng)和構(gòu)建事件驅(qū)動(dòng)的系統(tǒng)。
它確實(shí)可以充當(dāng)消息隊(duì)列,但不僅限于此。它可以充當(dāng)FIFO隊(duì)列、發(fā)布/訂閱消息系統(tǒng)、實(shí)時(shí)流處理平臺(tái)。由于Kafka的持久性存儲(chǔ)能力,甚至可以用作數(shù)據(jù)庫(kù)。
那么從上面的定義中,什么是分布式流處理和提交日志?
Kafka作為一個(gè)由一個(gè)或多個(gè)節(jié)點(diǎn)組成的集群工作,這些節(jié)點(diǎn)可以位于不同的數(shù)據(jù)中心,我們可以將數(shù)據(jù)/負(fù)載分布到Kafka集群中的不同節(jié)點(diǎn),它具有固有的可擴(kuò)展性、可用性和容錯(cuò)性。
Kafka將數(shù)據(jù)存儲(chǔ)為一系列連續(xù)的記錄,可以以不同的方法進(jìn)行處理。
當(dāng)您將數(shù)據(jù)推送到Kafka時(shí),它會(huì)將它們附加到記錄流中,就像將日志附加到日志文件中一樣。
讓我們開(kāi)始...
為了理解這一點(diǎn),讓我們深入研究關(guān)鍵主題:
1.消息
- 消息是Kafka的原子數(shù)據(jù)單位。
- 您可以推送字符串、整數(shù)、不同架構(gòu)的JSON以及其他任何內(nèi)容,但通常將不同類(lèi)型的消息推送到不同的主題中。
- 可以使用一個(gè)鍵(Key),它只是一些元數(shù)據(jù),用于確定目標(biāo)分區(qū)。
2.主題
我們可以將主題視為Kafka中的消息的邏輯類(lèi)別,它們是相同類(lèi)型數(shù)據(jù)的流。
3.分區(qū)
Image.jpeg
- 這基本上是分片技術(shù),是Kafka的擴(kuò)展能力背后的概念。
- 分區(qū)是使消息能夠并行分布在集群中的多個(gè)代理上的機(jī)制。使用這種并行性方法,Kafka可以同時(shí)支持多個(gè)消費(fèi)者和生產(chǎn)者的線性擴(kuò)展。這種分區(qū)方法允許消費(fèi)者和生產(chǎn)者的線性擴(kuò)展。
- 當(dāng)我們將主題的數(shù)據(jù)拆分為多個(gè)流時(shí),我們稱(chēng)所有這些較小的流為該主題的“分區(qū)”。
- 系統(tǒng)的性能還取決于設(shè)置分區(qū)的方式。
- 消息的偏移量是該消息的數(shù)組索引。圖中塊上的數(shù)字表示偏移量,第一個(gè)塊位于第0個(gè)偏移量處,最后一個(gè)塊位于(n-1)個(gè)偏移量處。
4.生產(chǎn)者
(1) 將消息發(fā)布到Kafka主題的Kafka客戶端。
生產(chǎn)者用于決定將消息發(fā)送到哪個(gè)分區(qū)。根據(jù)不同的配置和參數(shù),生產(chǎn)者決定目標(biāo)分區(qū)。
讓我們檢查不同的情況:
- 未指定鍵:生產(chǎn)者將隨機(jī)決定分區(qū),并嘗試平衡所有分區(qū)上的消息總數(shù)。
- 指定鍵:生產(chǎn)者使用一致性哈希[1]將鍵映射到分區(qū)。一致性哈希是一種哈希機(jī)制,在相同的鍵上始終生成相同的哈希值,它最小化了重新哈希情況下鍵的重新分布。
- 指定分區(qū):您也可以硬編碼目標(biāo)分區(qū)。
- 自定義分區(qū)邏輯:我們可以根據(jù)分區(qū)可以決定的一些規(guī)則編寫(xiě)規(guī)則。
(2) 您可以以3種方式將消息發(fā)送到Kafka。
- 發(fā)送并忘記 — 我們發(fā)送消息到Kafka代理并忘記它。由于Kafka是高可用的,成功的機(jī)會(huì)很大。
- 同步發(fā)送 — 您希望等待所有感興趣的消費(fèi)者完成您希望它們完成的任何操作
- 異步發(fā)送 — 您不希望等待所有感興趣的消費(fèi)者完成您希望它們完成的任何操作
我們還可以在將消息發(fā)送到代理之前在生產(chǎn)者上配置特性。
為了獲得更好的性能,我們可以使用Avro序列化/反序列化器。
5.消費(fèi)者
消費(fèi)者以有序的方式從分區(qū)中讀取消息。
每次消費(fèi)者讀取一條消息時(shí),它都會(huì)將偏移值存儲(chǔ)到Kafka或Zookeeper上,表示它是消費(fèi)者讀取的最后一條消息。
因此,如果消費(fèi)者節(jié)點(diǎn)崩潰,它可以恢復(fù)到上次讀取的位置。此外,如果在任何時(shí)候消費(fèi)者需要回到過(guò)去并讀取舊消息,它只需重置偏移位置即可。
(1) 輪詢循環(huán):
您可以配置分區(qū)分配策略。
- 范圍:消費(fèi)者獲取連續(xù)的分區(qū)
- 輪詢:輪詢分配器列出了所有可用的分區(qū)和所有可用的
嘗試在重新平衡時(shí)最小化影響,保持大部分分配不變,但允許協(xié)作重新平衡批處理大小。我們可以配置每次輪詢調(diào)用返回多少條記錄和多少數(shù)據(jù)。
(2) 提交偏移量:
在讀取消息時(shí),我們可以更新消費(fèi)者的偏移位置,這稱(chēng)為提交偏移量。可以啟用自動(dòng)提交,或者應(yīng)用程序可以顯式地提交偏移量。這可以同步和異步兩種方式完成。
6.消費(fèi)者組
一組消費(fèi)者一起工作,從一個(gè)主題中讀取消息。
1扇出交換: 可以由多個(gè)消費(fèi)者組訂閱單個(gè)主題。
一個(gè)實(shí)時(shí)示例是OTP發(fā)送服務(wù),可以在號(hào)碼上發(fā)送OTP,也可以發(fā)送到電子郵件。
Otp示例
1.訂單保證: 一個(gè)分區(qū)不能由同一個(gè)消費(fèi)者組中的多個(gè)消費(fèi)者讀取。這由消費(fèi)者組啟用,只有消費(fèi)者組中的一個(gè)消費(fèi)者可以從單個(gè)分區(qū)讀取。
在這里,生產(chǎn)者生成6條消息。每條消息都是鍵值對(duì),假設(shè)鍵“A”的值為“1”,“C”的值為“1”,“B”的值為“1”,“C”的值為“2”……“B”的值為“2”。
我們的主題有3個(gè)分區(qū),由于一致性哈希,具有相同鍵的消息始終進(jìn)入同一分區(qū),因此所有鍵為“A”的消息都會(huì)在一起分組,鍵為B和C的消息也是如此。
現(xiàn)在,由于每個(gè)分區(qū)只有一個(gè)消費(fèi)者,它們只按順序接收消息。因此,消費(fèi)者將在A2之前接收A1,在B2之前接收B1,因此保持了順序。
因此,對(duì)于3個(gè)分區(qū),您可以最多擁有3個(gè)消費(fèi)者,如果有4個(gè)消費(fèi)者,一個(gè)消費(fèi)者將處于空閑狀態(tài)。但對(duì)于3個(gè)分區(qū),您可以有2個(gè)消費(fèi)者,然后一個(gè)消費(fèi)者將從一個(gè)分區(qū)讀取,另一個(gè)消費(fèi)者將從兩個(gè)分區(qū)讀取。
7.代理
單個(gè)Kafka服務(wù)器。
代理接收來(lái)自生產(chǎn)者的消息,為它們分配偏移量,然后將它們提交到分區(qū)日志,基本上是將數(shù)據(jù)寫(xiě)入磁盤(pán),這賦予了Kafka其持久性特性。
8.集群
由多個(gè)代理節(jié)點(diǎn)協(xié)同工作以提供可擴(kuò)展性、可用性和容錯(cuò)性的集群。集群中的一個(gè)代理充當(dāng)控制器,負(fù)責(zé)將分區(qū)分配給代理。
當(dāng)一個(gè)分區(qū)被復(fù)制到3個(gè)代理時(shí),其中一個(gè)代理將充當(dāng)該分區(qū)的領(lǐng)導(dǎo)者,其余兩個(gè)將成為追隨者。
數(shù)據(jù)始終寫(xiě)入領(lǐng)導(dǎo)者代理,然后復(fù)制到追隨者。通過(guò)這種方式,我們既不會(huì)丟失數(shù)據(jù),也不會(huì)丟失集群的可用性,如果領(lǐng)導(dǎo)者崩潰,將選舉出另一個(gè)領(lǐng)導(dǎo)者。
讓我們深入一些編程內(nèi)容:
- 創(chuàng)建一個(gè)主題,創(chuàng)建該主題的5個(gè)分區(qū),并將所有5個(gè)主題的數(shù)據(jù)復(fù)制到總共3個(gè)節(jié)點(diǎn)。
- kafka-topics — create — zookeeper zookeeper:2181 — topic applog — partitions 5 — replication-factor 3
Zookeeper
在集群中多次聽(tīng)到這個(gè)術(shù)語(yǔ),讓我們看看它是什么?
Zookeeper作為Kafka的中央配置和共識(shí)管理系統(tǒng)。它跟蹤代理、主題和分區(qū)分配、領(lǐng)導(dǎo)者選舉,基本上是有關(guān)集群的所有元數(shù)據(jù)。
結(jié)束語(yǔ)
Kafka是一款出色的軟件,具有豐富的功能,可以在各種用例中使用。Kafka非常適合現(xiàn)代分布式系統(tǒng),因?yàn)樗峭ㄟ^(guò)設(shè)計(jì)分布式的。它最初由LinkedIn創(chuàng)建,目前由Confluent維護(hù)。像Uber、Netflix、Activision、Spotify、Slack、Pinterest、Coursera等頂級(jí)科技公司都在使用它。我們了解了Kafka的核心概念,以幫助您入門(mén)。還有很多其他東西,比如Kafka Stream API或kSql,由于時(shí)間有限,我們沒(méi)有討論。