Kafka如何保證高吞吐量


1.順序讀寫

kafka的消息是不斷追加到文件中的,這個特性使kafka可以充分利用磁盤的順序讀寫性能

順序讀寫不需要硬盤磁頭的尋道時間,只需很少的扇區旋轉時間,所以速度遠快於隨機讀寫

生產者負責寫入數據,Kafka會將消息持久化到磁盤,保證不會丟失數據,Kafka采用了倆個技術提高寫入的速度。

1.順序寫入:在大學的計算機組成(划重點)里我們學過,硬盤是機械結構,需要指針尋址找到存儲數據的位置,所以,如果是隨機IO,磁盤會進行頻繁的尋址,導致寫入速度下降。Kafka使用了順序IO提高了磁盤的寫入速度,Kafka會將數據順序插入到文件末尾,消費者端通過控制偏移量來讀取消息,這樣做會導致數據無法刪除,時間一長,磁盤空間會滿,kafka提供了2種策略來刪除數據:基於時間刪除和基於partition文件的大小刪除。

2.Memory Mapped Files:這個和Java NIO中的內存映射基本相同,在大學的計算機原理里我們學過(划重點),mmf直接利用操作系統的Page來實現文件到物理內存的映射,完成之后對物理內存的操作會直接同步到硬盤。mmf通過內存映射的方式大大提高了IO速率,省去了用戶空間到內核空間的復制。它的缺點顯而易見--不可靠,當發生宕機而數據未同步到硬盤時,數據會丟失,Kafka提供了produce.type參數來控制是否主動的進行刷新,如果kafka寫入到mmp后立即flush再返回給生產者則為同步模式,反之為異步模式。

2.零拷貝

在這之前先來了解一下零拷貝(直接讓操作系統的 Cache 中的數據發送到網卡后傳輸給下游的消費者):平時從服務器讀取靜態文件時,服務器先將文件從復制到內核空間,再復制到用戶空間,最后再復制到內核空間並通過網卡發送出去,而零拷貝則是直接從內核到內核再到網卡,省去了用戶空間的復制。

Kafka把所有的消息存放到一個文件中,當消費者需要數據的時候直接將文件發送給消費者,比如10W的消息共10M,全部發送給消費者,10M的消息在內網中傳輸是非常快的,假如需要1s,那么kafka的tps就是10w。Zero copy對應的是Linux中sendfile函數,這個函數會接受一個offsize來確定從哪里開始讀取。現實中,不可能將整個文件全部發給消費者,他通過消費者傳遞過來的偏移量來使用零拷貝讀取指定內容的數據返回給消費者。

在Linux kernel2.2 之后出現了一種叫做"零拷貝(zero-copy)"系統調用機制,就是跳過“用戶緩沖區”的拷貝,建立一個磁盤空間和內存的直接映射,數據不再復制到“用戶態緩沖區”,系統上下文切換減少為2次,可以提升一倍的性能。

3.分區

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

 

4.批量發送

kafka允許進行批量發送消息,producter發送消息的時候,可以將消息緩存在本地,等到了固定條件發送到kafka

  1. 等消息條數到固定條數
  2. 一段時間發送一次

5.數據壓縮

Kafka還支持對消息集合進行壓縮,Producer可以通過GZIP或Snappy格式對消息集合進行壓縮。
壓縮的好處就是減少傳輸的數據量,減輕對網絡傳輸的壓力。

Producer壓縮之后,在Consumer需進行解壓,雖然增加了CPU的工作,但在對大數據處理上,瓶頸在網絡上而不是CPU,所以這個成本很值得

批量發送數據壓縮一起使用,單條做數據壓縮的話,效果不明顯

 

Kafka的設計目標是高吞吐量,它比其它消息系統快的原因體現在以下幾方面:

1、Kafka操作的是序列文件I / O(序列文件的特征是按順序寫,按順序讀),為保證順序,Kafka強制點對點的按順序傳遞消息,這意味着,一個consumer在消息流(或分區)中只有一個位置。

2、Kafka不保存消息的狀態,即消息是否被“消費”。一般的消息系統需要保存消息的狀態,並且還需要以隨機訪問的形式更新消息的狀態。而Kafka 的做法是保存Consumer在Topic分區中的位置offset,在offset之前的消息是已被“消費”的,在offset之后則為未“消費”的,並且offset是可以任意移動的,這樣就消除了大部分的隨機IO。

3、Kafka支持點對點的批量消息傳遞。

4、Kafka的消息存儲在OS pagecache(頁緩存,page cache的大小為一頁,通常為4K,在Linux讀寫文件時,它用於緩存文件的邏輯內容,從而加快對磁盤上映像和數據的訪問)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM