Kafka 高效讀寫數據的原因

1. 順序寫磁盤

Kafka的producer生產數據,要寫入到log文件中,寫的過程是一直追加到文件末端,爲順序寫。官網有數據表明,同樣的磁
盤,順序寫能到600M/s,而隨機寫只有100K/s。這與磁盤的機械機構有關,順序寫之所以快,是因爲其省去了大量磁頭尋址的
時間。

2. 分段日誌 + 索引文件

分段日誌是通過數據的偏移量進行存儲,索引文件是能快速定位所要查詢數據的位置

1、Kafka把topic中一個parition大文件分成多個小文件段,通過多個小文件段,就容易定期清除或刪除已經消費完文件,
減少磁盤佔用。
2、通過索引信息可以快速定位message和確定response的最大大小。
3、通過index元數據全部映射到memory,可以避免segment file的IO磁盤操作。
4、通過索引文件稀疏存儲,可以大幅降低index文件元數據佔用空間大小。

3. 零拷貝

如下圖所示是普通Java讀取複製文件的一個流程
在這裏插入圖片描述

Java程序是無法直接操作硬件的,所以Java想要操作文件的話必須得通過操作系統去讀取文件。這時就會涉及大量
的讀寫緩存,因爲我們發送數據的時候不可能1kb的發,因此只能先緩存起來,這必定會涉及到大量的IO操作,由此可見
這樣的效率並不是非常高的。

零拷貝
在這裏插入圖片描述

1.在Kafka中我們的Java程序並不需要文件的內容,所以Kafka就使用了零拷貝的技術,因此Kafka當中的數據直接緩存在
操作系統當中,我們讀也在這裏讀 寫也在這裏寫,這樣的效率提高了許多
2.所謂的零拷貝並不是真正意義上的零拷貝 實際上是緩存了一次,只是相對於普通Java讀取複製文件少了許多中間的緩存

4. Page Cache

在這裏插入圖片描述

由上圖可見
1. 傳統的數據傳輸是先將數據緩存在內存當中,當數據達到一定的閾值再寫入到文件中。
2. Page Cache 是在操作系統開了一個內存將數據直接緩存到系統內存中。
3. 雖然將數據緩存到Page Cache中會比直接緩存到Memory中效率更低,但是當數據量達到一定的閾值的時候Memory會對
緩存中的數據進行溢寫,這樣的效率就會比直接寫入Page Cache會更低,因爲Page Cache對文件進行讀寫操作效率是非常
高的,而Memory對數據進行溢寫這時就需要請求操作系統,所以這樣的效率會比Page Cache對文件的讀寫操作效率低很多。
4. 緩存到Memory我們JVM所分配到的內存是有限的,而Page Cache是利用操作系統的內存。

5. 批量發送

kafka允許進行批量發送消息,producter發送消息的時候,可以將消息緩存在本地,等到了固定條件發送到kafka
	1. 等消息條數到固定條數
	2. 一段時間發送一次

6. 數據壓縮

Kafka還支持對消息集合進行壓縮,Producer可以通過GZIP或Snappy格式對消息集合進行壓縮
壓縮的好處就是減少傳輸的數據量,減輕對網絡傳輸的壓力
批量發送和數據壓縮一起使用效果最好,單條做數據壓縮的話,效果不明顯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章