如果不刪除硬盤肯定會(huì)被撐滿,所以Kakfa提供了兩種策略來(lái)刪除數(shù)據(jù)。一是基于時(shí)間,二是基于partition文件大小。具體配置可以參看它的配置文檔。
二、Page Cache
為了優(yōu)化讀寫(xiě)性能,Kafka利用了操作系統(tǒng)本身的Page Cache,就是利用操作系統(tǒng)自身的內(nèi)存而不是JVM空間內(nèi)存。這樣做的好處有:
1避免Object消耗:如果是使用 Java 堆,Java對(duì)象的內(nèi)存消耗比較大,通常是所存儲(chǔ)數(shù)據(jù)的兩倍甚至更多。
2避免GC問(wèn)題:隨著JVM中數(shù)據(jù)不斷增多,垃圾回收將會(huì)變得復(fù)雜與緩慢,使用系統(tǒng)緩存就不會(huì)存在GC問(wèn)題
相比于使用JVM或in-memory cache等數(shù)據(jù)結(jié)構(gòu),利用操作系統(tǒng)的Page Cache更加簡(jiǎn)單可靠。首先,操作系統(tǒng)層面的緩存利用率會(huì)更高,因?yàn)榇鎯?chǔ)的都是緊湊的字節(jié)結(jié)構(gòu)而不是獨(dú)立的對(duì)象。其次,操作系統(tǒng)本身也對(duì)于Page Cache做了大量?jī)?yōu)化,提供了 write-behind、read-ahead以及flush等多種機(jī)制。再者,即使服務(wù)進(jìn)程重啟,系統(tǒng)緩存依然不會(huì)消失,避免了in-process cache重建緩存的過(guò)程。
通過(guò)操作系統(tǒng)的Page Cache,Kafka的讀寫(xiě)操作基本上是基于內(nèi)存的,讀寫(xiě)速度得到了極大的提升。
三、零拷貝
linux操作系統(tǒng) “零拷貝” 機(jī)制使用了sendfile方法, 允許操作系統(tǒng)將數(shù)據(jù)從Page Cache 直接發(fā)送到網(wǎng)絡(luò),只需要最后一步的copy操作將數(shù)據(jù)復(fù)制到 NIC 緩沖區(qū), 這樣避免重新復(fù)制數(shù)據(jù) 。示意圖如下:
通過(guò)這種 “零拷貝” 的機(jī)制,Page Cache 結(jié)合 sendfile 方法,Kafka消費(fèi)端的性能也大幅提升。這也是為什么有時(shí)候消費(fèi)端在不斷消費(fèi)數(shù)據(jù)時(shí),我們并沒(méi)有看到磁盤io比較高,此刻正是操作系統(tǒng)緩存在提供數(shù)據(jù)。
當(dāng)Kafka客戶端從服務(wù)器讀取數(shù)據(jù)時(shí),如果不使用零拷貝技術(shù),那么大致需要經(jīng)歷這樣的一個(gè)過(guò)程:
1.操作系統(tǒng)將數(shù)據(jù)從磁盤上讀入到內(nèi)核空間的讀緩沖區(qū)中。
2.應(yīng)用程序(也就是Kafka)從內(nèi)核空間的讀緩沖區(qū)將數(shù)據(jù)拷貝到用戶空間的緩沖區(qū)中。
3.應(yīng)用程序?qū)?shù)據(jù)從用戶空間的緩沖區(qū)再寫(xiě)回到內(nèi)核空間的socket緩沖區(qū)中。
4.操作系統(tǒng)將socket緩沖區(qū)中的數(shù)據(jù)拷貝到NIC緩沖區(qū)中,然后通過(guò)網(wǎng)絡(luò)發(fā)送給客戶端。
no zero cop
從圖中可以看到,數(shù)據(jù)在內(nèi)核空間和用戶空間之間穿梭了兩次,那么能否避免這個(gè)多余的過(guò)程呢?當(dāng)然可以,Kafka使用了零拷貝技術(shù),也就是直接將數(shù)據(jù)從內(nèi)核空間的讀緩沖區(qū)直接拷貝到內(nèi)核空間的socket緩沖區(qū),然后再寫(xiě)入到NIC緩沖區(qū),避免了在內(nèi)核空間和用戶空間之間穿梭。
zero copy
可見(jiàn),這里的零拷貝并非指一次拷貝都沒(méi)有,而是避免了在內(nèi)核空間和用戶空間之間的拷貝。如果真是一次拷貝都沒(méi)有,那么數(shù)據(jù)發(fā)給客戶端就沒(méi)了不是?不過(guò),光是省下了這一步就可以帶來(lái)性能上的極大提升。
四、分區(qū)分段+索引
Kafka的message是按topic分類存儲(chǔ)的,topic中的數(shù)據(jù)又是按照一個(gè)一個(gè)的partition即分區(qū)存儲(chǔ)到不同broker節(jié)點(diǎn)。每個(gè)partition對(duì)應(yīng)了操作系統(tǒng)上的一個(gè)文件夾,partition實(shí)際上又是按照segment分段存儲(chǔ)的。這也非常符合分布式系統(tǒng)分區(qū)分桶的設(shè)計(jì)思想。
通過(guò)這種分區(qū)分段的設(shè)計(jì),Kafka的message消息實(shí)際上是分布式存儲(chǔ)在一個(gè)一個(gè)小的segment中的,每次文件操作也是直接操作的segment。為了進(jìn)一步的查詢優(yōu)化,Kafka又默認(rèn)為分段后的數(shù)據(jù)文件建立了索引文件,就是文件系統(tǒng)上的.index文件。這種分區(qū)分段+索引的設(shè)計(jì),不僅提升了數(shù)據(jù)讀取的效率,同時(shí)也提高了數(shù)據(jù)操作的并行度。
五、批量讀寫(xiě)
Kafka數(shù)據(jù)讀寫(xiě)也是批量的而不是單條的。
除了利用底層的技術(shù)外,Kafka還在應(yīng)用程序?qū)用嫣峁┝艘恍┦侄蝸?lái)提升性能。最明顯的就是使用批次。在向Kafka寫(xiě)入數(shù)據(jù)時(shí),可以啟用批次寫(xiě)入,這樣可以避免在網(wǎng)絡(luò)上頻繁傳輸單個(gè)消息帶來(lái)的延遲和帶寬開(kāi)銷。假設(shè)網(wǎng)絡(luò)帶寬為10MB/S,一次性傳輸10MB的消息比傳輸1KB的消息10000萬(wàn)次顯然要快得多。
六、批量壓縮
在很多情況下,系統(tǒng)的瓶頸不是CPU或磁盤,而是網(wǎng)絡(luò)IO,對(duì)于需要在廣域網(wǎng)上的數(shù)據(jù)中心之間發(fā)送消息的數(shù)據(jù)流水線尤其如此。進(jìn)行數(shù)據(jù)壓縮會(huì)消耗少量的CPU資源,不過(guò)對(duì)于kafka而言,網(wǎng)絡(luò)IO更應(yīng)該需要考慮。
1>如果每個(gè)消息都?jí)嚎s,但是壓縮率相對(duì)很低,所以Kafka使用了批量壓縮,即將多個(gè)消息一起壓縮而不是單個(gè)消息壓縮
2>Kafka允許使用遞歸的消息集合,批量的消息可以通過(guò)壓縮的形式傳輸并且在日志中也可以保持壓縮格式,直到被消費(fèi)者解壓縮
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過(guò),也去過(guò)華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)Java工程師,想要提升技能,往往是自己摸索成長(zhǎng)或者是報(bào)班學(xué)習(xí),但對(duì)于培訓(xùn)機(jī)構(gòu)動(dòng)則幾千的學(xué)費(fèi),著實(shí)壓力不小。自己不成體系的自學(xué)效果低效又漫長(zhǎng),而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年Java開(kāi)發(fā)全套學(xué)習(xí)資料》,初衷也很簡(jiǎn)單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時(shí)減輕大家的負(fù)擔(dān)。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上Java開(kāi)發(fā)知識(shí)點(diǎn),真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來(lái),每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且后續(xù)會(huì)持續(xù)更新
如果你覺(jué)得這些內(nèi)容對(duì)你有幫助,可以添加V獲?。簐ip1024b (備注Java)
面試準(zhǔn)備+復(fù)習(xí)分享:
為了應(yīng)付面試也刷了很多的面試題與資料,現(xiàn)在就分享給有需要的讀者朋友,資料我只截取出來(lái)一部分哦
了應(yīng)付面試也刷了很多的面試題與資料,現(xiàn)在就分享給有需要的讀者朋友,資料我只截取出來(lái)一部分哦文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-844721.html
[外鏈圖片轉(zhuǎn)存中…(img-P8vy2d4B-1712095303494)]文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-844721.html
到了這里,關(guān)于Kafka必須掌握的核心技術(shù):為什么吞吐量大、速度快?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!