对Kafka的总结
定位:kafka是一款分布式,高吞吐量,基于發(fā)布/訂閱的消息中間件。
核心組件:
broker:kafka服務(wù)器,負(fù)責(zé)消息的存儲(chǔ)和轉(zhuǎn)發(fā)。
topic:主題,消息的類(lèi)別,kafka按照topic分類(lèi)消息。
partition:分區(qū),一個(gè)topic可以有多個(gè)partition分區(qū),topic中的消息保存在各個(gè)partition上。
offset:偏移量。消息在kafka消息文件中的位置,可以理解為消息在partition上的偏移量,也是代表該消息的唯一序號(hào)。
producer:消息的生產(chǎn)者。
consumer:消息的消費(fèi)者。
consumer group: 消費(fèi)組,消費(fèi)者的分組,每個(gè)消費(fèi)者分組必須要屬于一個(gè)group
zookeeper:配置中心,保存kafka集群的broker,topic,partition等信息,另外還負(fù)責(zé)broker的故障發(fā)現(xiàn),partition的leader選舉,負(fù)載均衡等。
?
? Kafka的存儲(chǔ)設(shè)計(jì):
partition分區(qū)數(shù)據(jù)文件(offset,messageSize,data)
partition中的每條message包含3個(gè)屬性,offset表示這個(gè)消息在partition中的偏移量,可以看作每個(gè)消息的消息順序id。messageSIze則是消息的大小,data為消息的內(nèi)容。
數(shù)據(jù)文件分段segement(順序讀寫(xiě),分段命令,二分查找)
partition物理上是由多個(gè)segement文件組成,每個(gè)segement文件大小相同,順序讀寫(xiě)。而且每個(gè)segement文件都是以當(dāng)前文件中offset最小的值命名.log,這樣我們查offset消息時(shí),就可以很快二分查找定位到這個(gè)offset消息在哪個(gè)segement文件中。
數(shù)據(jù)文件索引(分段索引、稀疏存儲(chǔ))
kafka為每個(gè)segement文件建立了索引文件,文件名與segement文件名相同.index。但是kafka并沒(méi)有給每一條消息都建立索引,而是采取稀疏索引的方式,每隔一定字節(jié)的數(shù)據(jù)建立索引,從而避免索引文件過(guò)大,因此可以將索引文件放入內(nèi)存中。
?生產(chǎn)者設(shè)計(jì)(負(fù)載均衡)
由于topic是由多個(gè)partition組成,且partition均勻分布在不同的broker上,因此為了有效的利用broker的集群性能,提高吞吐量,producer會(huì)通過(guò)hash或者隨機(jī)等方式將消息平均發(fā)送到多個(gè)partittion上,以實(shí)現(xiàn)負(fù)載均衡。
批量發(fā)送
批量發(fā)送也是提高吞吐量的重要方式,Producer端可以在內(nèi)存中合并多條消息,以一次請(qǐng)求的方式批量發(fā)送給不同的Broker,從而大大減少broker存儲(chǔ)消息時(shí)的io操作,所以也一定程度上影響消息的實(shí)時(shí)性,但是換取了更好的吞吐量。
消息壓縮
producer端可以用GZIP或者Snappy對(duì)消息集合壓縮。producer端壓縮后,consumer也需要解壓,壓縮解壓需要消耗少量cpu資源,但是好處是減少傳輸?shù)臄?shù)據(jù)量,減輕網(wǎng)絡(luò)壓力,在大數(shù)據(jù)處理上,往往瓶頸體現(xiàn)在網(wǎng)絡(luò)上而不是cpu。
消費(fèi)者設(shè)計(jì)
consumer group?
同一 Consumer Group 中的多個(gè) Consumer 實(shí)例,不同時(shí)消費(fèi)同一個(gè) partition,等效于隊(duì)列模 式。partition內(nèi)消息是有序的,Consumer通過(guò)pull方式消費(fèi)消息。Kafka不刪除已消費(fèi)的消息?
對(duì)于partition,順序讀寫(xiě)磁盤(pán)數(shù)據(jù),以時(shí)間復(fù)雜度O(1)方式提供消息持久化能力。?
?
總結(jié)
- 上一篇: 杨辉三角java代码_【LeetCode
- 下一篇: windows 显示苹果分区_基准测试数