kafka概述
kafka是分佈式消息隊列,大體結構如下
- topic(主題):消息按照主題歸類,主題之間的數據是隔離的
- Producer(發送消息者)
- Consumer(消息接受者)
- broker:kafka集羣每個實例(server)
- zookeeper:kafka集羣,producer,consumer都依賴於zookeeper來保證系統可用性,保存一些meta信息
kafka特點
- 高吞吐量: Kafka 每秒可以生產約 25 萬消息(50 MB),每秒處理 55 萬消息(110 MB)。花了很多功夫去保證對磁盤的讀寫是連續的,不是隨機的,保證讀寫的速度
- 持久化數據存儲:可進行持久化操作。將消息持久化到磁盤,因此可用於批量消費
- 分佈式系統易於擴展:所有的 producer、broker 和 consumer 都會有多個,均爲分佈式的
- 客戶端狀態維護:客戶端與服務端通信中所需要記錄的信息或狀態,都由客戶端自己去存儲及維護,服務端只負責提供讀寫。這樣可以讓客戶端非常靈活。
主題(topic)
- 主題邏輯結構:藉助圖書館來理解,不同房間(主題)放不同類型的書籍,每個房間有很多書架(分區),每個書架上的書籍都有自己的唯一編號(消息的序列號:offset),並有序(消息是連續有序的)的放在書架上。
- kakfa消息清除機制:傳統的消息隊列是消費過的消息會被實時刪除,而kafka是配置一個時間T,消息發佈時間超過T後,則被批量清除,與消費無關。
- kafka常量級性能:Kafka的性能只與硬盤讀寫速度有關,因爲只需磁頭第一次定位,後續都是連續讀寫
- 分區實現負載均衡和失敗恢復:每個分區有多個副本(數量可配置),並以分區爲單位來劃分leader和follwer,這樣把ledaer分散到各個機器,充分利用所有機器的性能。leader負責寫和讀,其他的follwers只負責讀,並同步leader的數據,防止多個副本同時寫數據的混亂問題。
生產者(producers)
Producer將消息發佈到它指定的topic中,並負責決定發佈到哪個分區。通常簡單的由負載均衡機制隨機選擇分區,但也可以通過特定的分區函數選擇分區。
消費者(consumers)
offset由consumer來維護,一般情況下隨着consumer不斷的讀取消息,這offset的值不斷增加,但consumer可以將offset設置成爲一箇舊的值來重讀之前的消息。
消費者組,消費者裏可以加入消費者組。
組內是競爭關係(多個消費者形成一個集羣,解決單點故障),隊列模式,模擬傳統的消息隊列。
組間是共享關係(不同的消費者,構建各自的集羣),發佈訂閱模式
有序性
傳統的消息隊列,當多個consumer同時消費消息,服務器會按順序向consumer分發消息。但是消息到達各個comsumer時可能已經失去了原來的順序,所以只允許一個消費者消費消息。
Kafka將每個分區分只分發給一個consumer組,只要consumer組的數量不多於分區的數量即可併發訪問。