Kafka是如何实现高吞吐率的
轉(zhuǎn)載:http://aoyouzi.iteye.com/blog/2322673
Kafka是分布式消息系統(tǒng),需要處理海量的消息,Kafka的設(shè)計(jì)是把所有的消息都寫入速度低容量大的硬盤,以此來換取更強(qiáng)的存儲(chǔ)能力,但實(shí)際上,使用硬盤并沒有帶來過多的性能損失
?
kafka主要使用了以下幾個(gè)方式實(shí)現(xiàn)了超高的吞吐率
?
順序讀寫
?
kafka的消息是不斷追加到文件中的,這個(gè)特性使kafka可以充分利用磁盤的順序讀寫性能
?
順序讀寫不需要硬盤磁頭的尋道時(shí)間,只需很少的扇區(qū)旋轉(zhuǎn)時(shí)間,所以速度遠(yuǎn)快于隨機(jī)讀寫
?
Kafka官方給出了測(cè)試數(shù)據(jù)(Raid-5,7200rpm):
?
順序 I/O: 600MB/s
?
隨機(jī) I/O: 100KB/s
?
零拷貝
先簡(jiǎn)單了解下文件系統(tǒng)的操作流程,例如一個(gè)程序要把文件內(nèi)容發(fā)送到網(wǎng)絡(luò)
?
這個(gè)程序是工作在用戶空間,文件和網(wǎng)絡(luò)socket屬于硬件資源,兩者之間有一個(gè)內(nèi)核空間
?
在操作系統(tǒng)內(nèi)部,整個(gè)過程為:
在Linux kernel2.2 之后出現(xiàn)了一種叫做"零拷貝(zero-copy)"系統(tǒng)調(diào)用機(jī)制,就是跳過“用戶緩沖區(qū)”的拷貝,建立一個(gè)磁盤空間和內(nèi)存的直接映射,數(shù)據(jù)不再復(fù)制到“用戶態(tài)緩沖區(qū)”
?
系統(tǒng)上下文切換減少為2次,可以提升一倍的性能
文件分段
kafka的隊(duì)列topic被分為了多個(gè)區(qū)partition,每個(gè)partition又分為多個(gè)段segment,所以一個(gè)隊(duì)列中的消息實(shí)際上是保存在N多個(gè)片段文件中
通過分段的方式,每次文件操作都是對(duì)一個(gè)小文件的操作,非常輕便,同時(shí)也增加了并行處理能力
?
批量發(fā)送
Kafka允許進(jìn)行批量發(fā)送消息,先將消息緩存在內(nèi)存中,然后一次請(qǐng)求批量發(fā)送出去
?
比如可以指定緩存的消息達(dá)到某個(gè)量的時(shí)候就發(fā)出去,或者緩存了固定的時(shí)間后就發(fā)送出去
?
如100條消息就發(fā)送,或者每5秒發(fā)送一次
?
這種策略將大大減少服務(wù)端的I/O次數(shù)
?
數(shù)據(jù)壓縮
Kafka還支持對(duì)消息集合進(jìn)行壓縮,Producer可以通過GZIP或Snappy格式對(duì)消息集合進(jìn)行壓縮
?
壓縮的好處就是減少傳輸?shù)臄?shù)據(jù)量,減輕對(duì)網(wǎng)絡(luò)傳輸?shù)膲毫?/p>
?
Producer壓縮之后,在Consumer需進(jìn)行解壓,雖然增加了CPU的工作,但在對(duì)大數(shù)據(jù)處理上,瓶頸在網(wǎng)絡(luò)上而不是CPU,所以這個(gè)成本很值得
總結(jié)
以上是生活随笔為你收集整理的Kafka是如何实现高吞吐率的的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark 资源调度及任务调度
- 下一篇: Kafka消息投递语义-消息不丢失,不重