1、磁盤順序讀寫
保證了消息的堆積? ??
順序讀寫 磁盤會預讀,預讀即在讀取的起始地址連續讀取多個頁面,主要時間花費在了傳輸時間,而這個時間兩種讀寫可以認為是一樣的。
? ?
隨機讀寫 因為數據沒有在一起,將預讀浪費掉了,需要多次尋道和旋轉延遲,而這個時間可能是傳輸時間的許多倍。
2、零拷貝
避免CPU將數據從一塊存儲拷貝到另外一塊存儲的技術
? ? 傳統的數據復制:
- ? ? ? ? 讀取磁盤文件數據到內核緩沖區
- ? ? ? ? 將內核緩沖區的數據copy到用戶緩沖區
- ? ? ? ? 將用戶緩沖區的數據copy到socket的發送緩沖區
- ? ? ? ? 將socket發送緩沖區中的數據發送到網卡、進行傳輸
? ? 零拷貝:
? ? ? ? 磁盤文件 → 內核空間讀取緩沖區 → 網卡接口 → 消費者進程
3、分區分段+索引
? ? Kafka的message消息實際上是分布式存儲在一個一 個小的segment中的,每次文件操作也是直接操作的segment。為了進一步的查詢優化, Kafka又 默認為分段后的數據文件建立了索引文件,就是文件系統上的index文件。這種分區分段+索引的設計,不僅提升了數據讀取的效率,同時也提高了數據操作的并行度。
4、批量壓縮
多條消息一起壓縮,降低帶寬
5、批量讀寫
kafka允許進行批量發送消息,producer發送消息的時候,可以將消息緩存在本地,等到固定條件再發送到kafka
消息條數滿足固定條數
一段時間發送一次數據壓縮
kafka還支持對消息集合進行壓縮,producer可以通過GZIP或Snappy格式對消息集合進行壓縮,壓縮的好處就是減少傳輸的數據量,減輕對網絡傳輸的壓力。?
6、優化JVM
直接操作page cache,不是JVM、避免GC耗時及對象創建耗時,且讀寫速度更高,進程重啟、緩存也不會丟失。
?