概念
消息(Message):kafka的數據單元,相當於數據庫里面的一個數據行或一條記錄。消息由字節數組組成,所以對於Kafka 來說,消息里的數據沒有特別的格式或含義。消息可以有一個可選的元數據,也就是鍵。鍵也是一個字節數組,與消息一樣,對於Kafka來說也沒有特殊的含義。當消息以一種可控的方式寫入不同的分區時,會用到鍵。最簡單的例子就是為鍵生成一個一致性散列值,然后使用散列值對主題分區數進行取模,為消息選取分區。這樣可以保證具有相同鍵的消息總是被寫到相同的分區上。
主題和分區(Topic and Partitions):kafka的消息通過主題進行分類,相當於數據庫的表,或文件系統的文件夾。主題可以被分為若干個分區, 一個分區就是一個提交日志。消息以追加的方式寫入分區,然后以先入先出的順序讀取。由於一個主題一般包含幾個分區,因此無法在整個主題范圍內保證消息的順序,但可以保證消息在單個分區內的順序。kafka通過分區來實現數據冗余和伸縮性。分區可以分布在不同的服務器上,也就是說,一個主題可以橫跨多個服務器。
生產者(Producer):創建消息。
消費者(Consumer):讀取消息。而消費者是消費者群組的一部分,也就是說,會有一個或多個消費者共同讀取一個主題。群組保證每個分區只能被一個消費者使用。
偏移量(offset):消費者通過檢查消息的偏移盤來區分已經讀取過的消息。偏移量是另一種元數據,它是一個不斷遞增的整數值,在創建消息時,Kafka會把它添加到消息里。在給定的分區里,每個消息的偏移量都是唯一的。消費者把每個分區最后讀取的消息偏移量保存在Zookeeper或Kafka上,如果消費者關閉或重啟,它的讀取狀態不會丟失。
broker和集群:一個獨立的Kafka 服務器被稱為broker,接收來自生產者的消息,為消息設置偏移量,並提交消息到磁盤保存。broker 為消費者提供服務,對讀取分區的請求作出響應,返回已經提交到磁盤上的消息。根據特定的硬件及其性能特征,單個broker可以輕松處理數千個分區以及每秒百萬級的消息量。broker是集群的組成部分。每個集群都有一個broker同時充當了集群控制器的角色(自動從集群的活躍成員中選舉出來)。控制器負責管理工作,包括將分區分配給broker和監控broker在集群中, 一個分區從屬於一個broker,該broker被稱為分區的首領。一個分區可以分配給多個broker,這個時候會發生分區復制。這種復制機制為分區提供了消息冗余,如果有一個broker失效,其他broker可以接管領導權。不過,相關的消費者和生產者都要重新連接到新的首領。
特點
支持多個生產者:Kafka可以無縫地支持多個生產者,不管客戶端在使用單個主題還是多個主題。所以它很適合用來從多個前端系統收集數據,並以統一的格式對外提供數據。例如, 一個包含了多個微服務的網站,可以為頁面視圖創建一個單獨的主題,所有服務都以相同的消息格式向該主題寫入數據。消費者應用程序會獲得統一的頁面視圖,而無需協調來自不同生產者的數據流。
支持多個消費者:Kafka也支持多個消費者從一個單獨的消息流上讀取數據,而且消費者之間直不影響。這與其他隊列系統不同,其他隊列系統的消息一旦被一個客戶端讀取,其他客戶端就無法再讀取它。另外,多個消費者可以組成一個群組,它們共享一個悄息流,並保證整個群組對每個給定的消息只處理一次。
基於磁盤存儲:消費者可能會因為處理速度慢或突發的流量高峰導致無陸及時讀取消息,而持久化數據可以保證數據不會丟失。消費者可以在進行應用程序維護時離線一小段時間,而無需擔心消息丟失或堵塞在生產者端。消費者可以被關閉,但消息會繼續保留在Kafka 里。消費者可以從上次中斷的地方繼續處理消息。
可伸縮,高性能:通過橫向擴展生產者、消費者和broker, Kafka可以輕松處理巨大的消息流。在處理大量數據的同時,它還能保證亞秒級的消息延遲。