Kafka是分佈式消息系統,須要處理海量的消息,Kafka的設計是把全部的消息都寫入速度低容量大的硬盤,以此來換取更強的存儲能力,但實際上,使用硬盤並無帶來過多的性能損失
kafka主要使用瞭如下幾個方式實現了超高的吞吐率
緩存
kafka的消息是不斷追加到文件中的,這個特性使kafka能夠充分利用磁盤的順序讀寫性能
順序讀寫不須要硬盤磁頭的尋道時間,只需不多的扇區旋轉時間,因此速度遠快於隨機讀寫
Kafka官方給出了測試數據(Raid-5,7200rpm):
順序 I/O: 600MB/s
隨機 I/O: 100KB/s
網絡
先簡單瞭解下文件系統的操做流程,例如一個程序要把文件內容發送到網絡
這個程序是工做在用戶空間,文件和網絡socket屬於硬件資源,二者之間有一個內核空間
在操做系統內部,整個過程爲:
在Linux kernel2.2 以後出現了一種叫作"零拷貝(zero-copy)"系統調用機制,就是跳過「用戶緩衝區」的拷貝,創建一個磁盤空間和內存的直接映射,數據再也不復制到「用戶態緩衝區」
系統上下文切換減小爲2次,能夠提高一倍的性能
架構
kafka的隊列topic被分爲了多個區partition,每一個partition又分爲多個段segment,因此一個隊列中的消息其實是保存在N多個片斷文件中
經過分段的方式,每次文件操做都是對一個小文件的操做,很是輕便,同時也增長了並行處理能力
app
Kafka容許進行批量發送消息,先將消息緩存在內存中,而後一次請求批量發送出去
好比能夠指定緩存的消息達到某個量的時候就發出去,或者緩存了固定的時間後就發送出去
如100條消息就發送,或者每5秒發送一次
這種策略將大大減小服務端的I/O次數
socket
Kafka還支持對消息集合進行壓縮,Producer能夠經過GZIP或Snappy格式對消息集合進行壓縮
壓縮的好處就是減小傳輸的數據量,減輕對網絡傳輸的壓力
Producer壓縮以後,在Consumer需進行解壓,雖然增長了CPU的工做,但在對大數據處理上,瓶頸在網絡上而不是CPU,因此這個成本很值得。分佈式