Kafka如何保證高吞吐量

1.順序讀寫

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

順序讀寫不須要硬盤磁頭的尋道時間,只需不多的扇區旋轉時間,因此速度遠快於隨機讀寫緩存

生產者負責寫入數據,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再返回給生產者則爲同步模式,反之爲異步模式。app

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的設計目標是高吞吐量,它比其它消息系統快的緣由體如今如下幾方面:

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

二、Kafka不保存消息的狀態,即消息是否被「消費」。通常的消息系統須要保存消息的狀態,而且還須要以隨機訪問的形式更新消息的狀態。而Kafka 的作法是保存Consumer在Topic分區中的位置offset,在offset以前的消息是已被「消費」的,在offset以後則爲未「消費」的,而且offset是能夠任意移動的,這樣就消除了大部分的隨機IO。

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

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

相關文章
相關標籤/搜索