kafka消息快的原因

大家都知道技術選型上,kafka適合做大數(shù)據(jù)收集,比如kafka+storm流式計算。
kafka被設計的特點是快,那原因是什么昵?

1.上述消息存儲結構的設計kafka消息存儲設計

2.page cache

3.生產(chǎn)消費分布式讀寫

4.批量

存儲結構,就是持久化存儲用的磁盤,大數(shù)據(jù)分小文件(segment單元)存儲,方便根據(jù)offset二分快速查找定位小文件,設計有稀疏索引文件,方便快速查找具體message。
批量可以減少網(wǎng)絡請求的次數(shù),這是消息中間件通用的優(yōu)化點

page cache(參考博文

在命令行輸入cat /proc/meminfo,其中Cached就是Page Cache。Linux總會把系統(tǒng)中還沒被應用使用的內(nèi)存挪來給Page Cache,這是有OS管理的。

image

Page Cache中每個文件是一種多叉搜索樹,就跟數(shù)據(jù)庫的索引類似,節(jié)點由4k大小的Page組成,可以通過文件的偏移量快速定位到某個Page。

[圖片上傳中...(image-1ab9a6-1511006412683-0)]

當寫操作發(fā)生時,它只是將數(shù)據(jù)寫入Page Cache中,并將該頁置上dirty標志。

當讀操作發(fā)生時,它會首先在Page Cache中查找,如果有就直接返回了,沒有的話就會從磁盤讀取文件寫入Page Cache再讀取。

可見,只要生產(chǎn)者與消費者的速度相差不大,消費者會直接讀取之前生產(chǎn)者寫入Page Cache的數(shù)據(jù),大家在內(nèi)存里完成接力,根本沒有磁盤訪問。

既然linux操作系統(tǒng)有page cache,為什么應用還要引入應用緩存?

Page cache針對文件系統(tǒng),特點順序和4k,但是應用層的緩存大多緩存的是中間結果,是經(jīng)過計算或者裁剪組合后的。所以說這是操作系統(tǒng)不知業(yè)務應用,提供的方法論級別的設計。

kafka使用page cache還有一個好處是,Page Cache又不需要GC,是操作系統(tǒng)級別的緩存,即使Kafka重啟了,Page Cache數(shù)據(jù)依然還在。相應的,操作系統(tǒng)crash,會帶來數(shù)據(jù)丟失(那些還沒有被真正寫盤的數(shù)據(jù))。

真正寫盤的是fluher內(nèi)核線程,OS管理

至于寫盤的內(nèi)核線程,如何flush策略,是另一個話題。這也說明想高效使用kafka的化,使用單獨的機器部署server端,調(diào)整操作系統(tǒng)的page cache相關參數(shù)是可以調(diào)優(yōu)的。

消息的寫入

寫入會在log文件的尾部添加,文件的寫入是利用的操作系統(tǒng)的page緩存批量刷盤,所以kafka服務器的操作系統(tǒng)底層要支持,這是kafka吞吐量高能原因之一,寫入文件還有兩個兩個配置參數(shù),消息達到指定數(shù)目M,時間超過S秒。這個是broker端的控制

rather than maintain as much as possible in-memory and flush it all out to the filesystem in a panic when we run out of space, we invert that. All data is immediately written to a persistent log on the filesystem without necessarily flushing to disk. In effect this just means that it is transferred into the kernel's pagecache

批量操作

這個是消息中間件都會考慮添加的一個功能,cmq云上服務。這個是producor端的控制

消息的刪除

刪除的策略,保留N天的數(shù)據(jù),會有定時任務定時清理。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容