Apache Kafka是一個事件流平臺,其結(jié)合了三個關(guān)鍵的功能八回,使你可以完成端到端的事件流解決方案岩遗。
- 發(fā)布(寫)和訂閱(讀)事件流,包括從其他系統(tǒng)連續(xù)導入/導出數(shù)據(jù)控轿。
- 事件流存儲具有持久性和可靠性冤竹。
- 可以處理當前時刻或者以往的事件流。
所有這些功能都是以分布式茬射、高度可伸縮鹦蠕、彈性、容錯和安全的方式提供的在抛。Kafka是一個分布式系統(tǒng)钟病,由服務端和客戶端組成,通過高性能的TCP網(wǎng)絡協(xié)議進行通信刚梭。Kafka可以部署在裸金屬硬件肠阱、虛擬機和容器上,也可以部署在云上朴读。您可以選擇自管理您的Kafka環(huán)境和使用由各種供應商提供的完全管理的服務屹徘。
服務端:
服務端:Kafka作為一個集群運行一個或多個服務器,可以跨越多個數(shù)據(jù)中心或云區(qū)域磨德。其中一些服務器構(gòu)成存儲層缘回,稱為brokers。其他服務器運行Kafka Connect來持續(xù)導入和導出數(shù)據(jù)作為事件流典挑,將Kafka與您現(xiàn)有的系統(tǒng)集成酥宴,如關(guān)系數(shù)據(jù)庫以及其他Kafka集群。為了讓你實現(xiàn)關(guān)鍵任務的用例您觉,Kafka集群具有高度的可擴展性和容錯性:如果它的任何一個服務器發(fā)生故障拙寡,其他服務器將接管它們的工作,以確保持續(xù)的操作而不丟失任何數(shù)據(jù)琳水。
客戶端:它們允許您編寫分布式應用程序和微服務肆糕,這些應用程序和微服務可以并行地、大規(guī)模地讀取在孝、寫入和處理事件流诚啃,甚至在出現(xiàn)網(wǎng)絡問題或機器故障的情況下也可以容錯。Kafka附帶了一些這樣的客戶端私沮,這些客戶端被Kafka社區(qū)提供的幾十個客戶端增強了:客戶端可以用于Java和Scala始赎,包括更高級別的Kafka Streams庫,以及用于Go、Python造垛、C/ c++和許多其他編程語言以及REST api魔招。
主要概念和術(shù)語
事件記錄了在現(xiàn)實世界中或你的企業(yè)中“發(fā)生了某事”的事實。在文檔中也稱為記錄或消息五辽。當你讀或?qū)憯?shù)據(jù)到Kafka時办斑,你以事件的形式做這件事。從概念上講杆逗,事件具有鍵乡翅、值、時間戳和可選的元數(shù)據(jù)頭髓迎。下面是一個例子:
- Event key: "Alice"
- Event value: "Made a payment of $200 to Bob"
- Event timestamp: "Jun. 25, 2020 at 2:06 p.m."
生產(chǎn)者是那些向Kafka發(fā)布(寫)事件的客戶端應用程序峦朗,而消費者是那些訂閱(讀和處理)這些事件的應用程序。在Kafka中排龄,生產(chǎn)者和消費者是完全解耦的波势,彼此是不可知的,這是實現(xiàn)Kafka聞名的高可擴展性的一個關(guān)鍵設計元素橄维。例如尺铣,生產(chǎn)者從不需要等待消費者。Kafka提供了各種各樣的保證争舞,比如精確處理一次事件的能力凛忿。
事件被組織并持久地存儲在主題(topics)中。很簡單竞川,一個主題類似于文件系統(tǒng)中的一個文件夾店溢,事件就是該文件夾中的文件。一個示例主題名稱可以是“payments”委乌。Kafka中的主題總是多生產(chǎn)者和多訂閱者:一個主題可以有0個床牧、1個或多個生產(chǎn)者向它寫入事件,也可以有0個遭贸、1個或多個消費者訂閱這些事件戈咳。主題中的事件可以根據(jù)需要經(jīng)常讀取——與傳統(tǒng)消息傳遞系統(tǒng)不同,事件在使用后不會刪除壕吹。相反著蛙,你可以通過每個主題的配置設置來定義Kafka應該保留你的事件多長時間,之后舊的事件將被丟棄耳贬。Kafka的性能相對于數(shù)據(jù)大小來說是不變的踏堡,所以長時間存儲數(shù)據(jù)是完全可以的。
主題是分區(qū)的咒劲,這意味著一個主題分散在位于不同Kafka broker上的多個“桶”上暂吉。這種數(shù)據(jù)的分布式位置對于可伸縮性非常重要胖秒,因為它允許客戶機應用程序同時從/向多個代理讀取和寫入數(shù)據(jù)缎患。當一個新事件被發(fā)布到一個主題時慕的,它實際上被附加到主題的一個分區(qū)中。具有相同事件鍵(例如挤渔,客戶或車輛ID)的事件被寫入同一個分區(qū)肮街,Kafka保證任何給定主題分區(qū)的消費者都將始終以寫入的完全相同的順序讀取該分區(qū)的事件。
圖中這個示例主題有四個分區(qū)P1-P4判导。兩個不同的生產(chǎn)者客戶端通過網(wǎng)絡向主題的分區(qū)寫入事件嫉父,從而彼此獨立地向主題發(fā)布新事件。具有相同鍵的事件(圖中通過它們的顏色表示)被寫入同一個分區(qū)眼刃。注意绕辖,如果合適的話,兩個生產(chǎn)者都可以寫入同一個分區(qū)擂红。
為了保證你的數(shù)據(jù)具有容錯性和高可用性,每一個主題可以被復制,甚至跨geo-regions或數(shù)據(jù)中心,這樣總有多個brokers有一份數(shù)據(jù)以防出錯等等仪际。一個常見的生產(chǎn)設置是復制因子3,也就是說昵骤,您的數(shù)據(jù)總是有三個副本树碱。這個復制是在主題分區(qū)級別執(zhí)行的。
這篇入門文章應該足夠作介紹了变秦。如果你感興趣的話成榜,文檔的設計部分詳細地解釋了Kafka的各種概念。
Kafka APIs
除了用于管理和管理任務的命令行工具蹦玫,Kafka還有5個用于Java和Scala的核心api:
- 管理和檢查主題赎婚、brokers和其他Kafka對象的Admin API。
- Producer API發(fā)布(寫)事件流到一個或多個Kafka主題樱溉。
- Consumer API用于訂閱(讀取)一個或多個主題挣输,并處理生成給它們的事件流。
- Kafka Streams API實現(xiàn)流處理應用和微服務饺窿。它提供了處理事件流的高級函數(shù)歧焦,包括轉(zhuǎn)換、聚合和連接等有狀態(tài)操作肚医、窗口绢馍、基于事件時間的處理等等。從一個或多個主題讀取輸入肠套,以生成對一個或多個主題的輸出舰涌,有效地將輸入流轉(zhuǎn)換為輸出流。
- Kafka Connect API用于構(gòu)建和運行可重用的數(shù)據(jù)導入/導出連接器你稚,這些連接器消費(讀)或產(chǎn)生(寫)外部系統(tǒng)和應用的事件流瓷耙,以便它們能夠與Kafka集成朱躺。例如,到關(guān)系數(shù)據(jù)庫(如PostgreSQL)的連接器可能捕獲對一組表的每一個更改搁痛。然而长搀,在實踐中,你通常不需要實現(xiàn)自己的連接器鸡典,因為Kafka社區(qū)已經(jīng)提供了數(shù)百個隨時可用的連接器源请。