人人皆知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。

每一個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ū)

