故事就從什麼是kafka開始,我從官方文檔上面翻譯了這句話:Apache Kafka是一個分布式的流處理平台。我們知道作為一個流處理平台,它擁有三個關鍵的功能:可以釋出和訂閱流;可以以容錯的方式存儲流;還可以實時的處理流。
kafka作為一個分布式的流處理平台,它有兩大應用:一是能夠建構實時流資料管道,在系統和應用之間可靠地擷取資料;另一個應用是能夠建構轉換或響應資料流的實時流應用程式。kafka作為一個叢集運作在一個或多個伺服器上,這些伺服器可以跨越多個資料中心,根據topic的不同來分類存儲記錄流;每個記錄由key、value和timestamp組成。
如下圖所示,kafka叢集有五個核心的API;分别是生産者API、消費者API、流處理器、連接配接器、ADMIN API。下面對每個API做個簡要介紹:
- 生産者API: 允許應用程式釋出記錄流到一個或多個kafka主題
- 消費者API:允許應用程式訂閱一個或多個n主題,并處理這些主題接收到的記錄流
- Stream API:允許應用程式充當流處理器,從一個或多個主題擷取輸入流,并生産一個輸出流到一個或多個主題,能夠有效的轉換輸入流為輸出流
- Connector API:連接配接器API允許建構和運作可重用的生産者或消費者,将Kafka主題連接配接到現有的應用程式或資料系統。例如,連接配接到關系資料庫的連接配接器可能捕獲對表的每個更改。
- Admin API:允許管理和檢查主題、brokers和其它的kafka對象
kafka在用戶端與服務端之間的通信是通過一個簡單的、高性能的和語言無關的TCP協定完成的。
主題和分區
kafka通過主題進行分類,主題就好比資料庫中的表,檔案系統中的檔案夾。一個主題可以被分為若幹個分區,一個分區就是一個送出日志。消息是一個追加的方式寫入分區,然後以先入先出的順序讀取。一個主題可以橫跨多個伺服器,因為kafka通過分區的方式來實作資料備援和伸縮性,分區可以分布在不同的伺服器上。通常會使用流來描述kafka這類系統的資料。把一個主題的資料看成一個流,不管它有多少個分區。流是一組從生産者移動到消費者的資料。
每個分區都是一個有序的、不可變的記錄序列,它們被不斷地附加到一個結構化的送出日志中。分區中的每個記錄都被配置設定了一個稱為偏移量的連續id号,它惟一地辨別分區中的每個記錄。
實際上,每個使用者保留的唯一進制資料是該使用者在日志中的偏移量或位置。這個偏移量是由使用者控制的,通常使用者會在讀取記錄時線性地增加它的偏移量,但實際上,由于位置是由使用者控制的,是以它可以按自己喜歡的任何順序消費記錄。例如,使用者可以重置為較舊的偏移量,以重新處理過去的資料,或者直接跳到最近的記錄,并從“現在”開始使用。
生産者和消費者
生産者建立消息。生産者預設情況下把消息均衡地分布到主題的所有分區上,而并不關心特定消息會被寫到哪個分區。在特定的情況下,生産者也會講消息寫到指定的分區上,通過消息鍵和分區器來實作。
消費者讀取消息。消費者訂閱一個或多個主題,并按照消息生成的順序讀取它們。使用偏移量來區分已經讀取過的消息。偏移量是一個不斷遞增的整數值,在特定的分區中偏移量是唯一的,每個分區的最後偏移量儲存到zookeeper或kafka中。
消費者群組由一個或者多個消費者組成,同一個組中的消費者對于同一條消息隻消費一次。某一個主題下的分區數,對于消費組來說,應該小于等于該主題下的分區數。分區數越多,同一時間可以有越多的消費組進行消費,消費資料的速度就會越快,提高消費的性能。
每個分區都有一個伺服器來充當“leader”,由零個或多個伺服器來充當“followers”。“leader”處理所有的閱讀和請求,而“follower”被動的複制“leader”。如果“leader”
broker和叢集
一個獨立的kafka伺服器被稱為broker。broker接收來自生産者的消息,為消息設定偏移量,并送出消息到磁盤儲存。為消費者提供服務,對讀取分區的請求做出響應,傳回已經送出到磁盤上的消息。
broker是叢集中的一部分,每個叢集都有一個broker同時充當了叢集控制器的角色。控制器負責管理工作,包括将分區配置設定給broker和監控broker。在叢集中,一個分區從屬于一個broker,該broker被稱為分區的首領。
kafka預設的消息保留政策:要麼保留一段時間,要麼保留到消息達到一定大小的位元組數。下圖為kafka的整體架構圖:
kafaka好處
說了這麼多,那麼kafka有什麼好處呢?他的優點是什麼呢?
首先kakfa無縫的支援多個生産者,它很适合用來從多個前端系統收集資料,并以統一的格式對外提供資料;除了支援多個生産者以外,它也支援多個消費者從一個單獨的消息流上讀取資料,而且消費者之間互不影響;另外,多個消費者還可以組成一個群組,群組裡面的消費者共享一個消息流,并保證整個群組對每個給定的消息隻處理一次。不僅如此,它還允許消費者非實時地讀取消息;kakfa将消息送出到磁盤,并可以對不同主題設定規則進行儲存,這樣持久化儲存資料消費者不會因為處理速度慢或者突發情況而導緻的無法及時處理消息。
其次,kafka在一開始就被設計成一個靈活的可伸縮系統,它可以随着資料量不斷增長而可以線上的擴充broker,叢集擁有多個broker,即使個别broker出現問題,也可以保證能夠持續的為客戶提供服務;具有很好的可擴充性、容錯性。當然通過橫向擴充生産者、消費者和broker,使得kafka可以輕松處理巨大的消息流。
應用場景
光認識了還不行,kafka有哪些應用場景呢?下面總結了五個:
-
活動跟蹤
kafka最初的使用場景就是跟蹤使用者的活動。網站使用者與前端應用程式發生互動,前端應用程式生成使用者相關的消息;
-
傳遞消息
應用程式向使用者發送通知(比如郵件)就是通過傳遞消息來實作的。
-
度量名額和日志記錄
可以用于收集應用程式和系統度量名額以及日志
-
送出日志
kafka的基本概念就來源于送出日志,是以使用kafka送出日志是順利成章的事。
-
流處理
流式處理架構(spark,storm,flink)從主題中讀取資料,對其進行處理,并将處理後的資料寫入新的主題,供使用者和應用程式使用,kafka的強耐久性在流處理的上下文中也非常的有用。
好了,就先認識到這裡吧!下一篇,我們講講它是怎麼安裝的。
參考資料
Neha Narkhede, Gwen Shapira ,Todd Palino(著) , 薛命燈 (譯) . Kafka 權威指南 . 人民郵電出版社 . 2018.1