Kafka 什么速度那么快

批量發送消息

Kafka 采用了批量發送消息的方式,通過將多條消息按照分區進行分組,然后每次發送一個消息集合,看似很平常的一個手段,其實它大大提升了 Kafka 的吞吐量。

消息壓縮

消息壓縮的目的是為了進一步減少網絡傳輸帶寬。而對于壓縮算法來說,通常是數據量越大,壓縮效果才會越好。

因為有了批量發送這個前期,從而使得 Kafka 的消息壓縮機制能真正發揮出它的威力。對比壓縮單條消息,同時對多條消息進行壓縮,能大幅減少數據量,從而更大程度提高網絡傳輸率。

多分區

Kafka 使用的是多分區策略,消息被組織成一個一個的主題(topic),而主題可以劃分為多個分區(partition)。每個分區都是一個有序、持久化的日志,而 Kafka 通過分區來實現消息的水平擴展和負載均衡。

每個分區內的消息有一個唯一的偏移量(offset),消費者可以根據偏移量讀取消息。一個主題可以有多個分區,而消費者可以并行地消費不同分區的消息。

Kafka 使用分區的副本機制來實現數據的冗余備份,而每個主題的分區可以配置多個副本,其中一個副本為 leader(領導者),其他副本為 follower(跟隨者)。所有寫入操作都由 leader 處理,而 follower 會定期從 leader 同步數據,保持與 leader 數據的一致性。

當 leader 節點故障時,Kafka 會自動從剩余的 follower 中選舉新的 leader,確保數據的可用性。

?

順序寫入

Kafka 的特性之一就是高吞吐率,但是 Kafka 的消息是保存在磁盤上的,一般認為在磁盤上讀寫數據是會降低性能的,但是 Kafka 即使是普通的服務器,Kafka 也可以輕松支持每秒百萬級的寫入請求,超過了大部分的消息中間件,這種特性也使得 Kafka 在日志處理等海量數據場景廣泛應用。

Kafka 為防止丟失數據,會把收到的消息都寫入到硬盤中。為了優化寫入速度 Kafka 采用了兩個技術:順序寫入和 MMFile

因為硬盤是機械結構,每次讀寫都會尋址->寫入,其中尋址是一個“機械動作”,它是最耗時的。所以硬盤最討厭隨機I/O,最喜歡順序I/O。為了提高讀寫硬盤的速度,Kafka就是使用順序I/O。這樣省去了大量的內存開銷以及節省了IO尋址的時間。

即便是順序寫入硬盤,硬盤的訪問速度還是不可能追上內存。所以 Kafka 的寫入性能也不可能和內存進行對比,因此 Kafka 的數據并不是實時的寫入硬盤中,它充分利用了現代操作系統分頁存儲(Page Cache)來利用內存提高 I/O 效率。

Memory Mapped Files

Memory Mapped Files(MMAP或MMFile)也稱內存映射文件,在64位操作系統中一般可以表示20G的數據文件,它的工作原理是直接利用操作系統的 Page 實現文件到物理內存的直接映射。完成 MMAP 映射后,用戶對內存的所有操作會被操作系統自動的刷新到磁盤上,極大地降低了 IO 使用率。

?常規的文件操作為了提高讀寫性能,使用了 Page Cache 機制,但是由于頁緩存處在內核空間中,不能被用戶進程直接尋址,所以讀文件時還需要通過系統調用,將頁緩存中的數據再次拷貝到用戶空間中。而采用 mmap 后,它將磁盤文件與進程虛擬地址做了映射,并不會招致系統調用,以及額外的內存 copy 開銷,從而提高了文件讀取效率。

Page Cache

雖然磁盤順序寫已經很快了,但是對比內存順序寫仍然慢了幾個數量級。Kafka 用到了 Page Cache 技術,利用了操作系統本身的緩存技術,在讀寫磁盤日志文件時,其實操作的都是內存,然后由操作系統決定什么時候將 Page Cache 里的數據真正刷入磁盤。

?如果在極端的情況下會存在丟失數據的風險。

零拷貝

傳統模式下,當需要對一個文件進行傳輸的時候,其具體流程細節如下:

  1. 用戶進程調用 read ,系統調用向操作系統發出IO請求,請求讀取數據到自己的內存緩沖區中。自己進入阻塞狀態。
  2. 操作系統收到請求后,進一步將IO請求發送磁盤。
  3. 磁盤驅動器收到內核的IO請求,把數據從磁盤讀取到驅動器的緩沖中。此時不占用CPU。當驅動器的緩沖區被讀滿后,向內核發起中斷信號告知自己緩沖區已滿。
  4. 內核收到中斷,使用CPU時間將磁盤驅動器的緩存中的數據拷貝到內核緩沖區中。
  5. 如果內核緩沖區的數據少于用戶申請的讀的數據,重復步驟3跟步驟4,直到內核緩沖區的數據足夠多為止。
  6. 將數據從內核緩沖區拷貝到用戶緩沖區,同時從系統調用中返回,完成任務。

???????

?Kafka服務器在響應客戶端讀取的時候,底層使用 ZeroCopy 技術,直接將磁盤無需拷貝到用戶空間,而是直接將數據通過內核空間傳遞輸出,數據并沒有抵達用戶空間。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42232.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42232.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42232.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

故障012:定時備份作業-6007懸案

故障012:定時備份作業-6007懸案 1. 問題描述2. 解決過程2.1 大膽推想2.2 找規律2.3 嘗試換掉AP2.4 檢查資源限制2.5 資源放寬SYSDBA 3. 精神感悟 DM技術交流QQ群:940124259 1. 問題描述 詭異的現象總是伴隨著隱藏的功能被打開,可能耽誤你很…

比ChatGPT更強的星火大模型V2版本發布!

初體驗 測試PPT生成 結果: 達到了我的預期,只需要微調就可以直接交付,這點比ChatGPT要強很多. 測試文檔問答 結果: 這點很新穎,現在類似這種文檔問答的AI平臺收費都貴的離譜,星火不但免費支持而且效果也…

opencv圖片換背景色

#include <iostream> #include<opencv2/opencv.hpp> //引入頭文件using namespace cv; //命名空間 using namespace std;//opencv這個機器視覺庫&#xff0c;它提供了很多功能&#xff0c;都是以函數的形式提供給我們 //我們只需要會調用函數即可in…

uniapp評論列表插件獲取

從評論列表&#xff0c;回復&#xff0c;點贊&#xff0c;刪除&#xff0c;留言板 - DCloud 插件市場里導入&#xff0c;并使用。 代碼樣式優化及接入如下&#xff1a; <template><view class"hb-comment"><!-- 閱讀數-start --><view v-if&q…

5.利用matlab完成 符號矩陣的轉置和 符號方陣的冪運算(matlab程序)

1.簡述 Matlab符號運算中的矩陣轉置 轉置向量或矩陣 B A. B transpose(A) 說明 B A. 返回 A 的非共軛轉置&#xff0c;即每個元素的行和列索引都會互換。如果 A 包含復數元素&#xff0c;則 A. 不會影響虛部符號。例如&#xff0c;如果 A(3,2) 是 12i 且 B A.&#xff0…

java中excel文件下載

1、System.getProperty(user.dir) 獲取的是啟動項目的容器位置 2、 Files.copy(sourceFile.toPath(), destinationFile.toPath(), StandardCopyOption.REPLACE_EXISTING); StandardCopyOption.REPLACE_EXISTING 來忽略文件已經存在的異常&#xff0c;如果存在就去覆蓋掉它Sta…

00-認識C++

2、認識C 2.1、例子 一個簡單的C例子 #include <iostream>int main() {using namespace std; //使用名稱空間cout << "Com up and C me some time.";cout << endl; //換行符&#xff0c;還可以cout<<"\n";cout <…

驅動DAY5

1.實現設備文件和設備的綁定&#xff0c;編寫LED驅動 2.復習競態的解決方法和阻塞IO實現 第一個任務 頭文件 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;u…

【MySQL系列】表內容的基本操作(增刪查改)

「前言」文章內容大致是對MySQL表內容的基本操作&#xff0c;即增刪查改。 「歸屬專欄」MySQL 「主頁鏈接」個人主頁 「筆者」楓葉先生(fy) 目錄 一、MySQL表內容的增刪查改1.1 Create1.1.1 單行數據全列插入1.1.2 多行數據指定列插入1.1.3 插入否則更新1.1.4 數據替換 1.2 Ret…

MS Word表格寬度自適應

x.1 問題&#xff1a; 你的表格可能并沒有占滿整行&#xff0c;且右對齊&#xff0c;例如如下&#xff0c; x.2 解決方式 這個時候你想右對齊&#xff0c;你可以這么操作&#xff0c;點左上角的十字全選表格&#xff0c; 在布局里選擇自動對齊&#xff0c; 對齊方式選擇居中右…

git日常操作-案例

文章目錄 查看tag對應版本tag一個版本切換到指定tag查看遠程有那些分支 查看tag對應版本 要查看 Git 倉庫中標簽&#xff08;tag&#xff09;對應的版本&#xff0c;可以使用以下命令&#xff1a; git show <tag>將 替換為你要查看的標簽名稱。該命令將顯示與標簽對應的…

springBoot是如何實現自動裝配的

目錄 1 什么是自動裝配 2 Spring自動裝配原理 2.1 SpringBootConfiguration ?編輯 2.2 EnableAutoConfiguration 2.2.1 AutoConfigurationPackage 2.2.2 Import({AutoConfigurationImportSelector.class}) 2.3 ComponentScan 1 什么是自動裝配 自動裝配就是將官方寫好的的…

vue-cli前端工程化——創建vue-cli工程 router版本的創建 目錄結構 案例初步

目錄 引出創建vue-cli前端工程vue-cli是什么自動構建創建vue-cli項目選擇Vue的版本號 手動安裝進行選擇創建成功 手動創建router版多了一個router 運行測試bug解決 Vue項目結構main.jspackage.jsonvue.config.js Vue項目初步hello案例 總結 引出 1.vue-cli是啥&#xff0c;創建…

Redis Geo 數據類型在移動互聯網中的應用

Redis Geo 數據類型在移動互聯網中的應用 一、簡介1 Redis2 數據類型 二、Geo 數據類型1 Geo 數據類型2 Geo 數據類型的存儲方式3 Geo 數據類型的常用命令 三、Geo 數據類型應用場景1 附近的人和地點功能2 出租車實時定位3 物流配送服務 四、Redis Geo 數據優化策略1 降低查詢延…

android手勢事件

與手勢事件有關的方法 dispatchTouchEvent()&#xff1a;該方法將觸摸事件分發給相應的視圖或視圖組。onInterceptTouchEvent()&#xff1a;該方法用于判斷是否需要攔截觸摸事件&#xff0c;如果需要攔截&#xff0c;則返回 true&#xff0c;否則返回 false。onTouchEvent()&a…

神經網絡基礎-神經網絡補充概念-36-dropout正則化

概念 Dropout 是一種常用的正則化技術&#xff0c;用于減少深度神經網絡中的過擬合問題。它在訓練過程中隨機地將一部分神經元的輸出置為零&#xff0c;從而強制模型在訓練過程中學習多個獨立的子模型&#xff0c;從而減少神經元之間的依賴關系&#xff0c;提高模型的泛化能力…

記一次項目內存優化--內存泄漏

需求–內存泄漏優化&#xff0c;PSS有所下降&#xff0c; OOM率減少 主要是與某個版本作基準進行對比&#xff08;一般是最新版本的前一個版本作原數據&#xff09;&#xff0c;優化后&#xff0c;PSS有所下降&#xff0c;線上OOM率減少&#xff08;Bugly版本對比&#xff09;…

程序員如何利用公網遠程訪問查詢本地硬盤【內網穿透】

&#x1f3ac; 鴿芷咕&#xff1a;個人主頁 &#x1f525; 個人專欄: 《高效編程技巧》《cpolar》 ??生活的理想&#xff0c;就是為了理想的生活! 公網遠程訪問本地硬盤文件【內網穿透】 文章目錄 公網遠程訪問本地硬盤文件【內網穿透】前言1. 下載cpolar和Everything軟件1.…

React 生態應用 - React Router(1)

目錄 擴展學習資料 安裝和導入 Route匹配 src/components/navbar.jsx src/App.js 擴展學習資料 資料名稱 鏈接 備注 閱讀react router組件文檔 https://react-router.docschina.org/web/guides/philosophy Introduction | React Router 中文文檔 擴展閱讀 路由鑒權 …

(stm32)低功耗模式

低功耗模式 執行哪個低功耗模式的程序判斷流程 標志位設置操作一定要在WFI/WFE之前&#xff0c;調用此指令后立即進入睡眠判斷流程 模式對比 睡眠模式 停止模式 待機模式