本文將介紹最常用的分布式消息中間件kafka究抓。由于筆者水平受限,因此介紹不一定全面拧抖,也不會(huì)太深入佳遣,僅供參考识埋。
環(huán)境
- windows10
- kafka 2.1.1
安裝
- kafka依賴于zookeeper,因此需要先安裝zookeeper
- windows環(huán)境下kafka只需解壓即可使用零渐,但是需要注意解壓路徑不能包括空格
- 執(zhí)行
kafka-server-start.bat config\server.properties
啟動(dòng)服務(wù)
提示命令語(yǔ)法不正確
如果啟動(dòng)時(shí)提示命令語(yǔ)法不正確窒舟,那么需要在kafka安裝目錄中找到bin\windows目錄中的kafka-run-class.bat,為set COMMAND后面的%CLASSPATH%加上雙引號(hào)
基本概念
- topic诵盼,一個(gè)topic可以理解為一個(gè)邏輯上的消息隊(duì)列
- partition惠豺,一個(gè)topic包括一個(gè)或多個(gè)partition,同一個(gè)partition的數(shù)據(jù)必定在同一臺(tái)機(jī)器上
- segment风宁,partition以segment存儲(chǔ)洁墙,每個(gè)segment大小相同,對(duì)應(yīng)物理存儲(chǔ)文件
- retention period戒财,消息保留時(shí)間热监,超過(guò)被丟棄
- consume group,消費(fèi)組饮寞,kafka對(duì)同一個(gè)消費(fèi)組內(nèi)的實(shí)例做負(fù)載均衡孝扛,對(duì)不同消費(fèi)組做廣播列吼。一個(gè)partition會(huì)被指派到消費(fèi)組里的某個(gè)實(shí)例。
- leader和followers苦始,partition的主備模型
命令行操作
主題操作
- 創(chuàng)建主題
kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
- 查看主題
kafka-topics.bat --list --zookeeper localhost:2181
注意2.2版本可以直接用--bootstrap-server替代--zookeeper
生產(chǎn)消費(fèi)操作
- 生產(chǎn)消息
kafka-console-producer.bat --broker-list localhost:9092 --topic test
- 消費(fèi)消息
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning
消費(fèi)組操作
- 查看consumer group的offset
kafka-consumer-groups.bat --bootstrap-server localhost:9092 --describe --group my-group
- 查看所有的consumer group
kafka-consumer-groups.bat --bootstrap-server localhost:9092 --list
- 查看consumer group的所有成員
kafka-consumer-groups.bat --bootstrap-server localhost:9092 --describe --group my-group --members
- 刪除consumer group
kafka-consumer-groups.bat --bootstrap-server localhost:9092 --delete --group my-group --group my-other-group
- 修改consumer group的offset
kafka-consumer-groups.bat --bootstrap-server localhost:9092 --topic topic_name --group group_name --execute --reset-offsets --to-offset 0
生產(chǎn)者/消費(fèi)者
kafka消息格式
一條消息是一個(gè)record batch寞钥,包含record batch header,每條record又有各自的header
message delivery semantics陌选,消息投遞語(yǔ)義
- at most once理郑,最多一次,消息可能會(huì)丟失柠贤,但不會(huì)重復(fù)
先commit offset香浩,再進(jìn)行業(yè)務(wù)處理 - at least once类缤,最少一次臼勉,消息不會(huì)丟失,可能會(huì)重復(fù)
先進(jìn)行業(yè)務(wù)處理餐弱,再commit offset - exactly once宴霸,只消費(fèi)一次
如何實(shí)現(xiàn)exactly once
- 生產(chǎn)者:0.11.0.0之后的版本實(shí)現(xiàn)了冪等操作
- 消費(fèi)者:或者實(shí)現(xiàn)冪等,或者把commit offset和業(yè)務(wù)處理綁定成一個(gè)事務(wù)
- 使用kafka streams可以實(shí)現(xiàn)
leader
kafka文件存儲(chǔ)格式
一個(gè)segment由.index和.log組成膏蚓。.index是索引文件瓢谢,記錄每條消息的offset和在.log中的地址,.log中存儲(chǔ)具體的數(shù)據(jù)驮瞧。segment大小固定氓扛,但是包含不同數(shù)目的消息,segment文件的命名由上一個(gè)segment的最后一條消息的offset決定论笔。查詢指定offset消息的過(guò)程是先通過(guò)二分查找找到對(duì)應(yīng)的segment采郎,然后在.index文件中通過(guò)二分查找找到對(duì)應(yīng)的存儲(chǔ)地址。
kafka高性能實(shí)現(xiàn)
- kafka利用內(nèi)存映射文件技術(shù)狂魔,包括mmap和sendfile
- kafka客戶端會(huì)緩存數(shù)據(jù)然后批量操作
- byte copy蒜埋,從生產(chǎn)者到kafka到消費(fèi)者都是二進(jìn)制數(shù)據(jù),不需要轉(zhuǎn)換
log compaction
compaction指對(duì)相同key的數(shù)據(jù)進(jìn)行合并最楷。
- 開(kāi)啟log compaction
log.cleanup.policy=compact
- 開(kāi)啟compaction后整份,默認(rèn)情況下除了最后一個(gè)segment,都會(huì)進(jìn)行合并籽孙。
followers
kafka的高可用設(shè)計(jì)
每個(gè)partition都有一個(gè)leader烈评,若干個(gè)followers,讀寫(xiě)請(qǐng)求發(fā)送給leader處理犯建。leader維護(hù)了一個(gè)isr(in-sync replicas)列表讲冠,寫(xiě)數(shù)據(jù)時(shí)只有當(dāng)指定數(shù)量的isr告知已收到(acknowledge)leader才會(huì)commit,而數(shù)據(jù)只有commit之后才會(huì)被消費(fèi)者看到胎挎。告知已收到的數(shù)量可以由producer決定沟启,包括0,1或者all(-1)
崩潰恢復(fù)機(jī)制
如果分區(qū)的當(dāng)前l(fā)eader掛掉了忆家,會(huì)從isr列表中重新選舉leader。如果列表中的所有節(jié)點(diǎn)都掛掉了德迹,那么有以下幾種策略
- 等待isr列表中的節(jié)點(diǎn)恢復(fù)芽卿,然后成為leader
- 等待第一個(gè)節(jié)點(diǎn)恢復(fù)(可能不在isr列表中),然后成為leader
kafka vs rocketmq
- 定位:kafka主要定位于日志輸出胳搞,而rocketmq定位于非日志的可靠消息傳輸
- 存儲(chǔ):kafka多文件存儲(chǔ)卸例,rocketmq單文件存儲(chǔ),有人說(shuō)kafka吞吐量更高肌毅,也有人說(shuō)rocketmq支持更多的topic(性能下降平緩)筷转,不過(guò)據(jù)說(shuō)kafka 1.1.0之后可以支持20萬(wàn)的partition
- 備份:rocketmq沒(méi)有master選舉;rocketmq的slave可讀悬而,而kafka只能從leader讀