Kafka每秒可以處理一百萬條以上消息,吞吐量達到每秒百萬級。那么Kafka為什么那么高的吞吐量呢?
簡單來說有以下幾點原因:
1)、順序讀寫
Kafka的消息是不斷追加到文件末尾的,這個特性使Kafka可以充分利用磁盤的順序讀寫性能。順序讀寫不需要磁盤磁頭的尋道時間,避免了隨機磁盤尋址的浪費,只需很少的扇區旋轉時間,所以速度遠快於隨機讀寫。
Kafka中每個分區是一個有序的,不可變的消息序列,新的消息不斷追加到Partition的末尾,在Kafka中Partition只是一個邏輯概念,Kafka將Partition划分為多個Segment,每個Segment對應一個物理文件,Kafka對segment文件追加寫,這就是順序讀寫。
2)、零拷貝
在Linux Kernel2.2之后出現了一種叫做“零拷貝(zero-copy)”系統調用機制,就是跳過“用戶緩沖區”的拷貝,建立一個磁盤空間和內存的直接映射,數據不再復制到“用戶緩沖區”。
Kafka 使用到了 mmap+write(持久化數據) 和 sendfile(發送數據) 的方式來實現零拷貝。分別對應 Java 的 MappedByteBuffer 和 FileChannel.transferTo。
參考博客:什么是零拷貝
3)、分區並發
kafka中的topic中的內容可以分在多個分區(partition)存儲,每個partition又分為多個段segment,所以每次操作都是針對一小部分做操作,很輕便,並且增加並行操作的能力
4)、批量發送
Kafka允許進行批量發送消息,Productor發送消息的時候,可以將消息緩存在本地,等到了固定條件發送到kafka,可減少IO延遲
(1):等消息條數到固定條數
(2):一段時間發送一次
5)、數據壓縮
Kafka還支持對消息集合進行壓縮,Producer可以通過GZIP或Snappy格式對消息集合進行壓縮,壓縮的好處就是減少傳輸的數據量,減輕對網絡傳輸的壓力。
批量發送和數據壓縮一起使用,單條做數據壓縮的話,效果不太明顯。消息發送時默認不會壓縮,可使用compression.type來指定壓縮方式,可選的值為snappy、gzip和lz4
更多參考:https://mp.weixin.qq.com/s/iJJvgmwob9Ci6zqYGwpKtw
END.