寫在前面
本文為Kafka系列文章第三篇,全文可見:
- 【Kafka】1.特性與零拷貝
- 【Kafka】2.純原創(chuàng),一張圖洞悉Kafka集群
- 【Kafka】3.純原創(chuàng),消息的發(fā)送/存儲/消費流程綜述
- 【Kafka】4.高可用及Failover流程
昨天寫了一篇分享GRPC框架的博客竟然被jianshu給封了,也不知道這么純粹的技術(shù)文章是哪里違反規(guī)定了 。Anyway,我已經(jīng)申訴了 ,如果還是不行的話就換個平臺繼續(xù)寫吧。
今天來講講Kafka的一些知識 ,關(guān)于Kafka我們都知道是消息隊列組件,但是在全網(wǎng)搜了半天也沒有一篇文章系統(tǒng)地來講講Kafka的消息處理的完整流程,信息顯得太零碎了,所以我就動手總結(jié)了一下Kafka中消息的發(fā)送、存儲和消費的完整流程。其中的流程圖全部都是手畫的,麻煩轉(zhuǎn)載的時候至少跟我說一聲哈。
Producer - 消息寫入

消息寫入-重點邏輯
- 冪等性發(fā)送:每個消息都在producer內(nèi)根據(jù)topic,partition編號,對應(yīng)leader通過校驗編號實現(xiàn)有序接收和消息冪等
- 發(fā)送端的ACK配置:默認不等待,對于重要消息可以配置1或者2等待Leader及ISR的ACK消息
- ISR (in-sync replica set):
- leader在ZK中 (/brokers/<topic>/<partition/state)維護了一個與自身同步的follower集合
- 如果follower超過閾值時間 (replica.lag.time.max.ms,默認10s)未向leader拉取數(shù)據(jù)則會被剔出ISR。
- 可配置ISR最低值限制-min.insync.replicas,小于該數(shù)據(jù)則當前Partition不可用(無法寫入數(shù)據(jù))
Kafka集群-消息存儲

消息是全量存儲的但是會定期淘汰:
- 最大儲量log.retention.bytes
- 最大保留時間log.retention.hours (小時)
文件存儲結(jié)構(gòu)
- 每個partition的表現(xiàn)為一個文件夾
- partition文件夾內(nèi)部按照offset分segment,比如10000-19999,20000-29999
每個segment分為.log文件 (存儲消息內(nèi)容)和.index文件 (存儲每個offset在log文件中位置/偏移量)
查找消息的時間復(fù)雜度
基本為穩(wěn)定不變 —— O(1)+O(log(segment數(shù)量))+O(log(segment內(nèi)行數(shù)))
- 根據(jù)partition,拼出文件名找到對應(yīng)的文件夾:O(1)
- 文件夾內(nèi)使用二分法找到這一offset所在的segment:O (log (segment_num))
segment數(shù)量不會很大,取決于最大儲量/segment_size,比如就是45G/5G=9個文件,所以近似為常量 - 在segment.index文件內(nèi)部,同樣通過二分法找到這一offset所在的行,即可找到它在.log文件中的偏移量:O (log (lines_num))
lines_num最大值可配置,所以是常量
Consumer-消息消費

消息消費-重點邏輯
Rebalance:
觸發(fā)條件:Partition或ConsumerGroup內(nèi)的Consumer數(shù)量發(fā)生變化
分配邏輯:range-先均分,除不盡的部分按照字典序從前到后分配,所以4個partition分給3個consumer為:2 1 1Offset維護邏輯:
ConsumerGroup中的每個Partition的offset維護在_consumer_offset這個topic中
該Topic的每個Partition維護固定的ConsumerGroup中的所有數(shù)據(jù)(一對多)
提交Offset時是作為Producer向該Topic發(fā)送消息High Watermark:為leader+ISR中的最大offset的最小值,用于確保故障轉(zhuǎn)移時多副本之間的數(shù)據(jù)一致性
HW由Leader維護和更新,Consumer最大可拉取到HW,其后內(nèi)容不可見
故障轉(zhuǎn)移時,Leader+所有的Follower會舍棄HW之后的內(nèi)容,所有消息從HW重新開始累加
結(jié)尾
為了避免jianshu說我違規(guī),參考鏈接暫時就不貼了。