Kafka原始碼和文件閱讀與體會 一

2021-07-03 03:26:17 字數 2519 閱讀 5078

新的一天,新的技術

這幾天的技術,先講解kafka的內容,再結合原始碼細細品味

帶著問題去理解

kafka是什麼、做什麼、有什麼特色

kafka的設計

kafka是什麼、做什麼
kafka是乙個分布式、分割槽、副本提交的日誌服務,它提供了乙個訊息系統的功能 , 但是有獨特的設計

(官方 : kafka is a distributed, partitioned, replicated commit log service. it provides the functionality of a messaging system, but with a unique design.)

kafka的設計
先上圖

理解一下術語 :

看一下topic的partition的圖 :

中 , 所有partition 都屬於 同乙個topic , 寫入方根據相應的策略寫入不同的分割槽,在每乙個分割槽內部 , 每乙個訊息都有乙個offset作為識別符號 , 是按序遞增的,在partition0中從1-12 , 虛線的分割槽表示剛剛增加的訊息 , 相應的offset 是遞增1 , 11+1 =12 。

已經講了訊息按區寫入的過程 , 那麼 訊息最後是怎麼消費的?

有圖有真相 :

消費者編組成消費者組,但是,需要注意的是 , 乙個訊息可以被多個消費者組 「消費「, 但是,每乙個消費者組中的訊息只能被乙個消費者消費,所以,在kaka cluster中 , 訊息是按消費者組標記 + 消費者標記來分發的 .

(ps: 「消費」就是獲取集群中的訊息的行為)

上圖中還出現了kafka cluster的部分示意圖 . kafka 集群是由多個server組成,通過zookeeper進行管理負載均衡以及leader的選舉 , 前面partition的論述中提及 , 不同的partition可以在不同的機器上,也可以在同乙個機器上 , 那麼 , 一台機器/server 可以有乙個到多個partition , 深入一下 , 每乙個partition都有乙個leader 和 配置 的replica副本數量 , 實現容災 和 主從切換(zookeeper負責) , 為了配合zookeeper的主從切換和容災處理 , consumer和producer 都可以向 brokers提交 元資料請求獲取 此刻的 集群配置 , 如果由於網路等原因造成超時或者異常失敗 , 可以採用退避法等待一段時間再進行請求(有請求上限), 主從之間通過fetch執行緒交換資料 , 由從機fetch thread 發出網路請求 , 獲取主機資料進行備份 . 注意 , 每乙個server 都可以是 乙個到多個partition的主機 ,也同時是 其他partition的副本從機 ,副本數量可以通過配置 .

kafka 和傳統訊息模型的對比
傳統的訊息佇列在server端按序保留訊息 , 如果有多個消費者對佇列進行消費 , server 將按訊息儲存的順序對訊息進行處理 , 乙個訊息僅被消費一次。( server 雖然按序處理訊息 , 訊息卻是非同步傳遞給consumer 的)

相比傳統訊息佇列 , kafka 有更好的效能 , 它通過topics中的partition實現並行 , 同乙個topic的不同的partition可以同時進行獲取 .

kafka 訊息的順序保障 :

1、 由producer傳送給 特定的主題分割槽 (topic partition) 的 訊息(messages) 將會按他們到達的順序新增 , 也就是說 , 如果訊息m1 和m2 都是由同乙個producer傳送的 ,並且m1 先到達 , 那麼 , m1 相比m2的偏移量更低 , m1出現在日誌的前面。

2、消費者例項(consumer instance)是按訊息儲存在日誌中的順序 看到的訊息

3、對於有副本因子為n 的主題 (topic), 我們會有n-1個容錯節點 , 達到不丟失任何提交到日誌中的訊息的目的

kafka做什麼
官方給處理這幾個使用者案例 : 訊息系統 、 站點活** 、效能監控 、日誌聚合、流式處理。

kafka的特色
除了上述的producer 、 brokers 、producer 、 topic 、 partition 、replica 、 zookeeper的設計外 , kafka還有乙個特色 : 使用檔案系統儲存訊息 「檔案系統很慢,比快取慢多了」 , 在進行隨機讀寫的時候確實如此 , 但是 , 進行順序讀寫的時候那就未必了 ,效能甚至可能超過快取 。

今天寫到這裡,有空繼續

原始碼和文件分享 程式設計使用WMI

背景 wmi出現至今已經二十多年了,但很多人對它並不熟悉。知道它很好很強大,但不知道它從 來,怎麼工作,使用範圍是什麼?wmi有一組api。我們不管使用vbscript powershell指令碼還是利用c 的來訪問wmi的類庫,都是因為wmi向外暴露的一組api。這些api是在系統安裝wmi模組的...

原始碼和文件分享 執行單一例項

背景 病毒木馬在使用各種手段植入到使用者計算機後,也會使用渾身解數使自己被使用者執行啟用。但是,如果病毒木馬自己被多次重複執行,系統中存在多分病毒木馬的程序,那麼,這就有可能增加被暴露的風險。所以,要想解決上述問題,就要確保系統上只執行乙個病毒木馬的程序例項。確保執行乙個程序例項的實現方法有很多,可...

LinkedList原始碼閱讀與理解

linkedlist原始碼閱讀與理解 幾個變數 記錄長度 transient int size 0 記錄頭節點 transient nodefirst 記錄尾節點 transient nodelast 核心類 private static class node 幾個方法 元素加入鍊錶 public ...