[訊息佇列]kafka高效能/高吞吐量

Duancf發表於2024-10-03

Kafka每秒可以處理一百萬條以上訊息,吞吐量達到每秒百萬級。那麼Kafka為什麼那麼高的吞吐量呢?

簡單來說有以下幾點原因:

頁快取技術

Kafka是基於作業系統的頁快取來實現寫入的。作業系統本身有一層快取,叫做page cache,是在記憶體裡的快取,我們也可以稱之為 os cache,意思就是作業系統自己管理的快取。Kafka在寫入磁碟檔案的時候,可以直接寫入到這個os cache裡,也就是僅僅寫入到記憶體中,接下來由作業系統自己決定什麼時候把os cache裡的資料真的刷入磁碟檔案中。這樣可以很大提升寫效能。

磁碟順序寫

Kafka寫資料的時候,Kafka的訊息是不斷追加到檔案末尾的,而不是在檔案的隨機位置寫入資料,這個特性使Kafka可以充分利用磁碟的順序讀寫效能。順序讀寫不需要磁碟磁頭的尋道時間,避免了隨機磁碟定址的浪費,只需很少的扇區旋轉時間,所以速度遠快於隨機讀寫。

Kafka中每個分割槽是一個有序的,不可變的訊息序列,新的訊息不斷追加到Partition的末尾,在Kafka中Partition只是一個邏輯概念,Kafka將Partition劃分為多個Segment,每個Segment對應一個物理檔案,Kafka對segment檔案追加寫,這就是順序讀寫。

零複製

在消費資料的時候,實際上要從kafka的磁碟檔案裡讀取某條資料然後傳送給下游的消費者。Kafka在讀資料的時候為了避免多餘的資料複製,使用了零複製技術。也就是說直接讓os cache裡的資料傳送到網路卡後然後傳輸給下游的消費者,跳過中間從os cache複製到kafka 程序快取和再複製到socket快取中的兩次快取,同時也減少了上下文切換。在Linux Kernel2.2之後出現了一種叫做“零複製(zero-copy)”系統呼叫機制,就是跳過“使用者緩衝區”的複製,建立一個磁碟空間和記憶體的直接對映,資料不再複製到“使用者緩衝區”。Kafka 使用到了 mmap+write(持久化資料) 和 sendfile(傳送資料) 的方式來實現零複製。分別對應 Java 的 MappedByteBuffer 和 FileChannel.transferTo。

參考部落格:什麼是零複製

分割槽併發

kafka中的topic中的內容可以分在多個分割槽(partition)儲存,每個partition又分為多個段segment,所以每次操作都是針對一小部分做操作,很輕便,並且增加並行操作的能力

批次傳送

Kafka允許進行批次傳送訊息,Productor傳送訊息的時候,可以將訊息快取在本地,等到了固定條件傳送到kafka,可減少IO延遲
(1):等訊息條數到固定條數
(2):一段時間傳送一次

資料壓縮

Kafka還支援對訊息集合進行壓縮,Producer可以透過GZIP或Snappy格式對訊息集合進行壓縮,壓縮的好處就是減少傳輸的資料量,減輕對網路傳輸的壓力。批次傳送和資料壓縮一起使用,單條做資料壓縮的話,效果不太明顯。訊息傳送時預設不會壓縮,可使用compression.type來指定壓縮方式,可選的值為snappy、gzip和lz4

相關文章