kafka性能為什么好

人人皆知kafka性能好,但真正了解原因的人就少了很多。說起來也是悲傷的故事,我的某次面試就涼在此題。那么從設(shè)計的角度看,kafka是如何實現(xiàn)高性能的呢?

1.寫得快

Kafka會把消息寫入到硬盤,絕對不會丟失數(shù)據(jù)。為了優(yōu)化寫入速度Kafak采用了兩個技術(shù), 順序?qū)懭?/strong> 和 MMFile

順序?qū)懭?/h4>

因為硬盤是機械結(jié)構(gòu),尋址是最耗時的。所以硬盤最“討厭”隨機I/O,最喜歡順序I/O,Kafka就是使用順序I/O。


image.png

每一個Partition其實都是一個文件 ,收到消息后Kafka會把數(shù)據(jù)插入到文件末尾(虛框部分)。

Memory Mapped Files

Kafka的數(shù)據(jù)并 不是實時的寫入硬盤,它充分利用了現(xiàn)代操作系統(tǒng) 分頁存儲 來利用內(nèi)存提高I/O效率。操作系統(tǒng)會選擇適當(dāng)?shù)臅r機將數(shù)據(jù)寫入硬盤。

缺點就是 不可靠,寫到mmap中的數(shù)據(jù)并沒有被真正的寫到硬盤,操作系統(tǒng)會在程序主動調(diào)用flush的時候才把數(shù)據(jù)真正的寫到硬盤。

Kafka提供了一個參數(shù)——producer.type來控制是不是主動flush,如果Kafka寫入到mmap之后就立即flush然后再返回Producer叫 同步 (sync);寫入mmap之后立即返回Producer不調(diào)用flush叫 異步 (async)。

2.讀得快

cosumer向broker索要消息時,kafka使用 零拷貝(zero-copy) ,建立一個磁盤空間和內(nèi)存的直接映射,數(shù)據(jù)不再復(fù)制到“用戶態(tài)緩沖區(qū)”,直接復(fù)制到socket緩沖區(qū)

普通io
零拷貝
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容