Kafka作為高吞吐量的分布式消息系統(tǒng),通過多重機(jī)制保障數(shù)據(jù)的完整性和可靠性。本文將從消息防丟失、消費(fèi)模式、存儲(chǔ)形式及支撐服務(wù)四個(gè)維度展開詳細(xì)解析。
一、Kafka如何保證消息不丟失
- 生產(chǎn)者端保障機(jī)制
- 異步發(fā)送模式下啟用回調(diào)確認(rèn)
- 同步發(fā)送模式設(shè)置acks=all/-1(需所有ISR副本確認(rèn))
- 配置retries參數(shù)實(shí)現(xiàn)自動(dòng)重試
- 設(shè)置max.in.flight.requests.per.connection=1保證順序重試
- Broker端持久化策略
- 消息追加寫入Commit Log文件
- 支持多副本機(jī)制(Replication)
- 采用ISR(In-Sync Replicas)同步副本列表
- 支持min.insync.replicas配置最低同步副本數(shù)
- 消費(fèi)者端確認(rèn)機(jī)制
- 啟用手動(dòng)提交offset(enable.auto.commit=false)
- 處理完消息后調(diào)用commitSync()同步提交
- 配合事務(wù)機(jī)制保證精確一次處理
二、Kafka消費(fèi)數(shù)據(jù)模式
- 消費(fèi)者組模式(Consumer Group)
- 同一分組內(nèi)消費(fèi)者平均分配分區(qū)
- 支持水平擴(kuò)展和負(fù)載均衡
- 實(shí)現(xiàn)"一個(gè)分區(qū)只被一個(gè)消費(fèi)者消費(fèi)"
- 獨(dú)立消費(fèi)者模式
- 直接指定消費(fèi)的分區(qū)
- 適用于特殊場景的定點(diǎn)消費(fèi)
- 兩種訂閱方式
- 主題訂閱(subscribe):動(dòng)態(tài)分區(qū)分配
- 分區(qū)分配(assign):靜態(tài)指定分區(qū)
三、Kafka的數(shù)據(jù)存儲(chǔ)形式
- 分區(qū)日志結(jié)構(gòu)
- 每個(gè)分區(qū)對(duì)應(yīng)一個(gè)物理文件夾
- 采用順序追加寫入方式
- 通過分段(Segment)機(jī)制管理文件
- 索引文件設(shè)計(jì)
- .index文件:存儲(chǔ)offset到物理位置的映射
- .timeindex文件:支持按時(shí)間戳查找
- 采用稀疏索引提升查詢效率
- 數(shù)據(jù)清理策略
- 基于時(shí)間的保留策略(log.retention.hours)
- 基于大小的保留策略(log.retention.bytes)
- 支持日志壓縮(Log Compaction)去除重復(fù)鍵
四、數(shù)據(jù)處理和存儲(chǔ)支持服務(wù)
- Connect框架
- 提供標(biāo)準(zhǔn)化數(shù)據(jù)導(dǎo)入導(dǎo)出接口
- 支持與關(guān)系數(shù)據(jù)庫、HDFS等系統(tǒng)集成
- 內(nèi)置多種Connector實(shí)現(xiàn)
- Streams API
- 實(shí)現(xiàn)實(shí)時(shí)流處理功能
- 支持狀態(tài)管理、窗口操作
- 提供Exactly-Once語義保障
- 監(jiān)控與管理工具
- Kafka Manager可視化管控平臺(tái)
- 內(nèi)置Metric指標(biāo)收集
- 支持JMX監(jiān)控接口
- 集群協(xié)調(diào)服務(wù)
- 依賴ZooKeeper維護(hù)元數(shù)據(jù)
- 管理Broker注冊(cè)、主題配置
- 協(xié)調(diào)消費(fèi)者組Rebalance操作
通過上述機(jī)制的協(xié)同工作,Kafka構(gòu)建了一套完整的數(shù)據(jù)可靠性保障體系,在保證高性能的提供了企業(yè)級(jí)的數(shù)據(jù)持久化和處理能力。