Apache Kafka是一種分布式事件存儲(chǔ)和流處理平臺(tái)。該項(xiàng)目旨在提供一個(gè)統(tǒng)一的、高吞吐量、低延遲的平臺(tái),用于處理實(shí)時(shí)數(shù)據(jù)流。
•Kafka可以通過(guò)Kafka Connect連接到外部系統(tǒng)(用于數(shù)據(jù)導(dǎo)入/導(dǎo)出),并提供Kafka Streams庫(kù)用于流處理應(yīng)用程序。•它有許多用例,包括分布式日志記錄、流處理、數(shù)據(jù)集成和發(fā)布/訂閱消息傳遞。•Kafka是一個(gè)數(shù)據(jù)流系統(tǒng),允許開(kāi)發(fā)人員實(shí)時(shí)響應(yīng)新事件的發(fā)生。•Kafka的架構(gòu)由存儲(chǔ)層和計(jì)算層組成。存儲(chǔ)層旨在高效存儲(chǔ)數(shù)據(jù),并且是一個(gè)分布式系統(tǒng),如果存儲(chǔ)需求隨時(shí)間增長(zhǎng),可以輕松地?cái)U(kuò)展系統(tǒng)以適應(yīng)增長(zhǎng)。
計(jì)算層由四個(gè)核心組件組成:
1.生產(chǎn)者(Producer)2.消費(fèi)者(Consumer)3.流處理(Streams)4.連接器(Connectors)API,使得Kafka可以在分布式系統(tǒng)中擴(kuò)展應(yīng)用程序。
1. 生產(chǎn)者和消費(fèi)者API: Kafka強(qiáng)大的應(yīng)用程序?qū)拥幕A(chǔ)是用于訪問(wèn)存儲(chǔ)的兩個(gè)基本API,即用于寫入事件的生產(chǎn)者API和用于讀取事件的消費(fèi)者API。在這兩個(gè)API之上構(gòu)建了用于集成和處理的API。
2. Kafka Connect: Kafka Connect建立在生產(chǎn)者和消費(fèi)者API之上,提供了一種將數(shù)據(jù)在Kafka和外部系統(tǒng)之間集成的簡(jiǎn)單方法。源連接器從外部系統(tǒng)中獲取數(shù)據(jù)并將其發(fā)送到Kafka主題。接收器連接器從Kafka主題獲取數(shù)據(jù)并將其寫入外部系統(tǒng)。
3. Kafka Streams: 用于處理到達(dá)的事件的Kafka Streams是一個(gè)JAVA庫(kù),建立在生產(chǎn)者和消費(fèi)者API之上。Kafka Streams允許您執(zhí)行實(shí)時(shí)流處理、強(qiáng)大的轉(zhuǎn)換和事件數(shù)據(jù)的聚合。
基本概念
消息(Message)
•消息是信息的記錄。每條消息都有一個(gè)可選的鍵,用于將消息路由到適當(dāng)?shù)姆謪^(qū),以及必需的值,即實(shí)際的信息。消息的鍵和值都是字節(jié)數(shù)組。
Kafka主題(Kafka Topics)
•主題是事件的日志。•Apache Kafka的最基本的組織單元是主題,類似于關(guān)系數(shù)據(jù)庫(kù)中的表。•您可以創(chuàng)建不同的主題來(lái)保存不同類型的事件,并創(chuàng)建不同的主題來(lái)保存過(guò)濾和轉(zhuǎn)換后的同一類型的事件。
重要屬性:
•首先,它們是追加寫入的:當(dāng)您將新消息寫入日志時(shí),它總是追加到末尾。•其次,它們只能通過(guò)在日志中尋找任意偏移量來(lái)進(jìn)行讀取,然后按順序掃描日志條目進(jìn)行讀取。•第三,日志中的事件是不可變的 - 一旦某件事發(fā)生,幾乎不可能撤消它。•日志本質(zhì)上也是持久的。傳統(tǒng)的企業(yè)消息系統(tǒng)具有主題和隊(duì)列,用于臨時(shí)存儲(chǔ)消息以在源和目標(biāo)之間進(jìn)行緩沖。•每個(gè)主題可以配置為在達(dá)到一定年齡后過(guò)期數(shù)據(jù)。
Kafka分區(qū)(Kafka Partitioning)
•為了在主題中分布事件的存儲(chǔ)和處理,Kafka使用分區(qū)的概念。一個(gè)主題由一個(gè)或多個(gè)分區(qū)組成,這些分區(qū)可以存在于Kafka集群中的不同節(jié)點(diǎn)上。•分區(qū)是Kafka事件的主要存儲(chǔ)單元,盡管在分層存儲(chǔ)(Tiered Storage)中,一些事件存儲(chǔ)被移出了分區(qū)。•分區(qū)也是并行處理的主要單元。可以通過(guò)同時(shí)寫入多
個(gè)分區(qū)來(lái)并行地將事件寫入主題。
•同樣,消費(fèi)者可以通過(guò)每個(gè)消費(fèi)者實(shí)例從不同的分區(qū)讀取,將其工作負(fù)載分散開(kāi)來(lái)。如果只使用一個(gè)分區(qū),只能有效地使用一個(gè)消費(fèi)者實(shí)例。
分區(qū)工作原理:
•將主題分割為分區(qū)后,我們需要一種方法來(lái)決定將消息寫入哪個(gè)分區(qū)。通常情況下,如果消息沒(méi)有鍵,則后續(xù)消息將循環(huán)分布在主題的所有分區(qū)中。•例如,如果您正在生成與同一客戶關(guān)聯(lián)的所有事件,使用客戶ID作為鍵可以確保來(lái)自給定客戶的所有事件始終按順序到達(dá)。
Kafka Broker
•從物理基礎(chǔ)設(shè)施的角度來(lái)看,Apache Kafka由一組稱為Broker的機(jī)器網(wǎng)絡(luò)組成。•它們是獨(dú)立的機(jī)器,每臺(tái)機(jī)器上運(yùn)行一個(gè)Kafka broker進(jìn)程。•每個(gè)Broker托管一些分區(qū)并處理將新事件寫入這些分區(qū)或從這些分區(qū)讀取事件的傳入請(qǐng)求。Broker還處理分區(qū)之間的復(fù)制。
集群(Cluster)
•Broker作為集群的一部分運(yùn)行,共享負(fù)載并提供容錯(cuò)能力。
偏移量(Offset)
•每條消息通過(guò)主題、所屬分區(qū)和偏移量號(hào)唯一標(biāo)識(shí)。偏移量是一個(gè)不斷遞增的整數(shù),以唯一地標(biāo)識(shí)消息在給定主題和分區(qū)中。在分區(qū)內(nèi),消息按偏移量號(hào)進(jìn)行排序。
復(fù)制(Replication)
•數(shù)據(jù)復(fù)制是Kafka的一個(gè)關(guān)鍵功能,它使得Kafka能夠提供高持久性和可用性。我們可以在主題級(jí)別啟用復(fù)制。•創(chuàng)建新主題時(shí),可以指定復(fù)制因子,然后該主題的每個(gè)分區(qū)將被多次復(fù)制。•這個(gè)數(shù)字被稱為復(fù)制因子。使用復(fù)制因子N,通常情況下,我們可以容忍N(yùn)-1個(gè)故障,而不會(huì)丟失數(shù)據(jù),并保持可用性。•每次讀寫到分區(qū)時(shí),都經(jīng)過(guò)主分區(qū)(leader)。•只有當(dāng)所有同步副本將消息寫入其預(yù)寫日志時(shí),消息才被視為已提交。•生產(chǎn)者可以單獨(dú)配置確認(rèn)策略。
Kafka生產(chǎn)者(Producers)
•生產(chǎn)者庫(kù)的API界面相當(dāng)輕量級(jí):在Java中,有一個(gè)稱為KafkaProducer的類,您可以使用它連接到集群。•從表面上看,這是與生產(chǎn)消息有關(guān)的所有API界面。在幕后,該庫(kù)管理連接池、網(wǎng)絡(luò)緩沖區(qū)、等待代理確認(rèn)消息、在必要時(shí)重新傳輸消息等一系列細(xì)節(jié),應(yīng)用程序程序員不需要關(guān)心這些細(xì)節(jié)。
消費(fèi)者(Consumers)
•使用消費(fèi)者API與生產(chǎn)者類似。您使用一個(gè)稱為KafkaConsumer的類來(lái)連接到集群。•首先,Kafka與傳統(tǒng)消息隊(duì)列不同之處在于讀取消息不會(huì)將其銷毀;•實(shí)際上,在Kafka中,許多消費(fèi)者從一個(gè)主題中讀取是很正常的。
Kafka Connect
•一方面,Kafka Connect是一種可插拔連接器的生態(tài)系統(tǒng),另一方面,它是一個(gè)客戶端應(yīng)用程序。作為客戶端應(yīng)用程序,Connect是一個(gè)在與Kafka brokers獨(dú)立的硬件上運(yùn)行的服務(wù)器進(jìn)程。
Kafka Streams
•Kafka Streams是一個(gè)Java API,為您提供了對(duì)流處理的所有計(jì)算原語(yǔ)的便捷訪問(wèn):過(guò)濾、分組、聚合、連接等,使您不必在消費(fèi)者API之上編寫框架代碼來(lái)執(zhí)行所有這些操作。•它還提供對(duì)由流處理計(jì)算產(chǎn)生的可能大量的狀態(tài)的支持。
流處理中的事件?
•事件是發(fā)生的事情的記錄,同時(shí)提供有關(guān)發(fā)生的事情的信息。事件的示例包括客戶訂單、付款、網(wǎng)站上的點(diǎn)擊或傳感器讀數(shù)。•事件記錄由時(shí)間戳、鍵、值和可選的標(biāo)頭組成。事件有效負(fù)載通常存儲(chǔ)在值中,鍵是可選的。
Kafka持久性
•發(fā)布的每批消息都存儲(chǔ)在分區(qū)的活動(dòng)日志段中,其格式與生產(chǎn)者發(fā)布的格式完全相同。消息格式在生產(chǎn)者、消費(fèi)者和代理之間保持一致,消除了序列化和反序列化的開(kāi)銷。•Kafka使用頁(yè)面緩存進(jìn)行讀寫。所有讀取將直接從頁(yè)面緩存中進(jìn)行,寫入首先應(yīng)用于頁(yè)面緩存,然后定期同步。
日志壓縮
•Kafka主題的保留策略可以配置為“壓縮”或“刪除”。刪除根據(jù)日志保留字節(jié)或日志保留時(shí)間段清除舊的段文件。•如果將保留策略配置為壓縮,Kafka只會(huì)保留每個(gè)消息鍵的最新消息。如果
我們正在獲取與給定鍵相關(guān)的許多更新,并且只對(duì)最新消息感興趣,這將非常有用。例如,用戶更新事件。
領(lǐng)導(dǎo)者選舉
•當(dāng)代理崩潰時(shí),它無(wú)法向Zookeeper發(fā)送心跳。Zookeeper的會(huì)話超時(shí),然后通知集群控制器代理故障的情況。集群控制器獲取代理是領(lǐng)導(dǎo)者的所有分區(qū),并選擇ISR中的下一個(gè)條目并將其提升為領(lǐng)導(dǎo)者。