溫故而知新 Kafka實現高吞吐的原理

2021-10-04 10:44:29 字數 1142 閱讀 1521

kafka的訊息是不斷追加到檔案中的,這個特性使kafka可以充分利用磁碟的順序讀寫效能

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

生產者負責寫入資料,kafka會將訊息持久化到磁碟,保證不會丟失資料,kafka採用了倆個技術提高寫入的速度。

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

在這之前先來了解一下零拷貝:平時從伺服器讀取靜態檔案時,伺服器先將檔案從複製到核心空間,再複製到使用者空間,最後再複製到核心空間並通過網絡卡傳送出去,而零拷貝則是直接從核心到核心再到網絡卡,省去了使用者空間的複製。

kafka把所有的訊息存放到乙個檔案中,當消費者需要資料的時候直接將檔案傳送給消費者,比如10w的訊息共10m,全部傳送給消費者,10m的訊息在內網中傳輸是非常快的,假如需要1s,那麼kafka的tps就是10w。zero copy對應的是linux中sendfile函式,這個函式會接受乙個offsize來確定從**開始讀取。現實中,不可能將整個檔案全部發給消費者,他通過消費者傳遞過來的偏移量來使用零拷貝讀取指定內容的資料返回給消費者。

在linux kernel2.2 之後出現了一種叫做"零拷貝(zero-copy)"系統呼叫機制,就是跳過「使用者緩衝區」的拷貝,建立乙個磁碟空間和記憶體的直接對映,資料不再複製到「使用者態緩衝區」,系統上下文切換減少為2次,可以提公升一倍的效能。

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

kafka允許進行批量傳送訊息,producter傳送訊息的時候,可以將訊息快取在本地,等到了固定條件傳送到kafka

等訊息條數到固定條數

一段時間傳送一次

producer壓縮之後,在consumer需進行解壓,雖然增加了cpu的工作,但在對大資料處理上,瓶頸在網路上而不是cpu,所以這個成本很值得

溫故而知新

堆排 建立堆,維護堆的屬性 一次拿掉乙個,然後維護屬性,二分的結構 使得維護屬性只要logn的時間 冒泡也是一次拿走乙個 但是線性的結構 每次沒有節省時間 快排 一次確定 乙個值的位置,然後二分,縮小問題的範圍。floyd找最短 一次更新 將狀態改為經過固定點的 最短距離 迴圈 遍歷每個點,則結果為...

溫故而知新(一)

一 c 基礎語法 1.注釋符 b.解釋所寫的 2.vs中常用的快捷鍵 3.變數 用來在計算機中儲存資料 b.要給儲存空間起乙個有意義的名字,方便我們以後的使用 b.變數型別 變數名 值 4.命名規則 5.號的使用 6.佔位符的使用 先挖坑,再填坑 異常 exception 在程式執行的過程中,由於某...

C 陣列 溫故而知新

using system using system.collections.generic using system.linq using system.text namespace 陣列 陣列初始化器只能在宣告陣列變數時使用,不能在宣告陣列之後使用 int iii new int 用花括號初始化陣...