kafka高吞吐、低延時、高性能的實現原理

作者:源碼時代-Raymon老師

Kafka的高吞吐、低延時、高性能的實現原理

Kafka是大數據領域無處不在的消息中間件,目前廣泛使用在企業內部的實時數據管道,并幫助企業構建自己的流計算應用程序。Kafka雖然是基于磁盤做的數據存儲,但卻具有高性能、高吞吐、低延時的特點,其吞吐量動輒幾萬、幾十上百萬,這其中的原由值得我們一探究竟,讓我們一起掌握Kafka各種精巧的設計。

吞吐量:吞吐量是指在一定時間內通過系統、網絡或設備傳輸的數據量或處理的事務數量。它是衡量系統性能和效率的重要指標之一。

  • 對于網絡,吞吐量可以指網絡連接的數據傳輸速率,單位可以是字節/秒或比特/秒
  • 對于服務器或數據庫系統,吞吐量可以表示系統每秒能夠處理的事務或請求的數量
  • 在存儲系統中,吞吐量可以表示系統每秒讀取或寫入的數據量。

較高的吞吐量意味著系統能夠更快地處理數據,而較低的吞吐量可能導致數據傳輸延遲和系統繁忙。

kafka,每毫秒可以處理1條數據,每秒可以處理1000條數據,這個單位時間內可以處理多少條數據,就叫做吞吐量,1000條數據,每條數據10kb,吞吐量相當于是每秒處理大概10mb的數據


低延遲:低延遲是指系統或應用在處理請求或傳輸數據時所需的時間盡可能地短。

如果來一條數據就處理一條數據,可能會導致每條數據要處理假設1毫秒,那么此時每秒可以處理1000條數據,這就是每秒的吞吐量,但是如果采用微批處理技術呢?比如說把10毫秒內的數據收集起來一共有1000條數據,接著一次性交給引擎來處理,1毫秒就把1000條數據給處理完了。那么1秒內就可以處理10萬條數據,吞吐量直接提升100倍。


這個就是所謂的流式計算采用的微批處理技術,你一條一條處理,每條數據都需要啟動新的計算資源,有網絡開銷,甚至是磁盤開銷。但是你一次性處理1000條,跟你一次性處理1條其實是差不多的。

接下來我們看看Kafka的高吞吐以及低延時實現的底層原理是什么。

1、頁緩存技術 + 磁盤順序寫

首先Kafka每次接收到數據都會往磁盤上去寫,如下圖所示:

如果把數據基于磁盤來存儲,頻繁的往磁盤文件里寫數據,這個性能會不會很差?大家肯定都覺得磁盤寫性能是極差的。

但是實際上Kafka在這里有極為優秀和出色的設計,就是為了保證數據寫入性能,首先Kafka是基于操作系統的頁緩存來實現文件寫入的。(操作系統本身有一層緩存,叫做page cache,是在內存里的緩存,我們也可以稱之為os cache,意思就是操作系統自己管理的緩存。)

在寫入磁盤文件的時候,可以直接寫入這個os cache里,也就是僅僅寫入內存中,接下來由操作系統自己決定什么時候把os cache里的數據真的刷入磁盤文件中。
僅僅這一個步驟,就可以將磁盤文件寫性能提升很多了,因為這里相當于是在寫內存,不是在寫磁盤,大家看下圖:

光有頁緩存這一點已經可以提升很多性能了,但是kafka在這里還使用到一個磁盤順序寫的技術,也就是說,僅僅將數據追加到文件的末尾,不是在文件的隨機位置來修改數據。

對于一塊硬盤,它有幾個重要指標:順序讀寫能力和隨機讀寫能力. 若把硬盤比作一個倉庫,硬盤中的數據比作倉庫中各種各樣的貨物. 硬盤的讀寫比作倉庫中一個工人的進貨和出貨. 這時如果一個工人需要取一個大電冰箱,雖然冰箱很大很重,但是工人卻能很快完成,這就是順序讀寫.

但如果一個工作需要同時取一瓶水,一個文具盒、一包面包、一個鼠標、一管牙膏等,雖然它們很小很輕,但工作必須跑遍整個倉庫才能拿到它們. 因此,工人往往會做的更慢,這就是隨機讀寫.

小結:
頁緩存+磁盤順序寫的方式讓kafka的寫性能極高,最大程度減少了每條數據處理的時間開銷,反過來就大幅度提升了每秒處理數據的吞吐量,一般kafka部署在物理機上,單機每秒寫入幾萬到幾十萬條消息是沒問題的。
這種方式同時也兼顧了低延遲和高吞吐兩個要求,盡量把每條消息的寫入性能壓榨到極致,就可以實現低延遲的寫入,同時對應的每秒的吞吐量自然就提升了,這也是kafka非常核心的一個底層機制。

2、零拷貝實現高性能讀取

那么在消費數據的時候,需要從磁盤文件里讀取數據后通過網絡發送出去,這個時候怎么提升性能呢?
首先就是利用了page cache技術,之前說過,kafka寫入數據到磁盤文件的時候,實際上是寫入page cache的,沒有直接發生磁盤IO,所以寫入的數據大部分都是停留在os層的page cache里的(這個本質其實跟elasticsearch的實現原理是類似的)

然后在讀取的時候,如果正常情況下從磁盤讀取數據,先嘗試從page cache讀,讀不到才從磁盤IO讀,讀到數據以后先會放在os層的一個page cache里,接著會發生上下文切換到系統那邊,把os的讀緩存數據拷貝到應用緩存里。

接著再次發生上下文切換到os層,把應用緩存的數據拷貝到os的socket緩存中,最后數據再發送到網卡上:【非零拷貝的實現方案

這個過程里,發生了好幾次上下文切換,而且還涉及到了好幾次數據拷貝,如果不考慮跟硬件之間的交互,起碼是從os cache到用戶緩存,從用戶緩存到socket緩存,有兩次拷貝是絕對沒必要的。

但是如果用零拷貝技術,就是linux的sendfile,就可以直接把操作交給os,os看page cache里是否有數據,如果沒有就從磁盤上讀取,如果有的話直接把os cache里的數據拷貝給網卡了,中間不用走那么多步驟了:【零拷貝技術

跟上圖一對比是不是零拷貝技術就快多了?所以呢,通過零拷貝技術來讀取磁盤上的數據,還有page cahce的幫助,這個性能就非常高了。

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

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

相關文章

可信固件-M (TF-M)

概述: 參考: Trusted Firmware-M Documentation — Trusted Firmware-M v2.0.0 documentation 開源代碼托管: trusted-firmware-m.git - Trusted Firmware for M profile Arm CPUs STM32 U5支持TF-M : STM32U5 — Trusted Firmware-M v2.0.0 document…

Meta Platforms推出Imagine:基于Emu的免費AI文本到圖像生成器服務

Meta Platform是Facebook、Instagram 和 WhatsApp 的母公司,也是領先的開源AI人工智能大語言模型 Llama 2的創建者。Meta Platforms 推出了一個名為 Imagine 的獨立文本到圖像 AI 生成器服務。Imagine 是基于 Meta 自己的 AI 模型 Emu 構建的,Emu 是在11…

循環結構中 break、continue、return 和exit() 的區別

循環結構中 break、continue、return 和exit() 的區別 文章目錄 循環結構中 break、continue、return 和exit() 的區別一、break語句二、continue語句三、return 語句四、exit() 函數 說明:本文內容參考牟海軍 著《C語言進階: 重點、難點與疑點解析》&a…

HTML程序大全(1):簡易計算器

HTML代碼&#xff0c;主要創建了幾個按鈕。 <div class"container"><div class"output" id"output">0</div><button class"button" onclick"clearOutput()" id"clear">C</button>…

C#調用win10系統自帶軟鍵盤的方法

上次做了個筆記是關于調用windows系統自帶的觸摸鍵盤的方法&#xff1a;C#調用Windows系統自帶觸摸鍵盤的方法_c# 虛擬鍵盤-CSDN博客 除了調用觸摸鍵盤&#xff0c;我們也可以通過調用win10的自帶軟鍵盤作為輸入途徑。 方法很簡單。 1、添加using System.Diagnostics引用。 …

選自《洛谷深入淺出進階篇》——歐拉函數+歐拉定理+擴展歐拉定理

歐拉函數&#xff1a; 歐拉函數定義&#xff1a; 1~n中與n互質的數的個數。 比如 歐拉函數是積性函數&#xff1a;&#xff08;也就是&#xff09;當 n與m互質的時候&#xff1a; 由算術基本定理&#xff0c;我們可以設n&#xff0c;那么我們只要計算出的取值就能求出的取…

5組10個共50個音頻可視化效果PR音樂視頻制作模板

我們常常看到的圖形跟著音樂跳動&#xff0c;非常有節奏感&#xff0c;那這個是怎么做到的呢&#xff1f;5組10個共50個音頻可視化效果PR音樂視頻制作模板滿足你的制作需求。 PR音樂模板|10個音頻可視化視頻制作模板05 https://prmuban.com/36704.html 10個音頻可視化視頻制作…

linux下查看文件當下的所有文件的大小和查找大文件

要查詢一個文件夾下面所有文件的總大小&#xff0c;您可以使用 du 命令配合一些參數。如果您只關心總大小&#xff0c;而不是各個子文件夾或文件的大小&#xff0c;可以使用以下命令&#xff1a; du -sh /path/to/your/directory在這個命令中&#xff1a; du 是磁盤使用情況的…

設計師福利!免費實用的7款Figma插件,讓你的工作事半功倍!

如今&#xff0c;Figma已經成為主流的原型和數字設計軟件之一&#xff0c;許多UI設計師和設計團隊開始選擇使用Figma。隨著Figma的快速更新和迭代&#xff0c;Figma插件庫變得越來越豐富。如果使用得當&#xff0c;將有助于提高您的設計效率。本文將介紹7個工作中非常實用的Fig…

echarts詞云圖echarts-wordcloud使用方法

1、echarts5.0以下的版本使用 echarts-wordcloud 1.0 的詞云 1. 安裝 wordCloud 1.0 依賴包npm install echarts-wordcloud12. man.js 注入import echarts-wordcloud 2、echarts5.0及以上的下載 echarts-wordcloud 2.0 版本 注意&#xff1a;npm install echarts-wordcloud …

微軟發布Orca2,“調教式”教會小規模大語言模型如何推理!

我們都知道在大多數情況下&#xff0c;語言模型的體量和其推理能力之間存在著正相關的關系&#xff1a;模型越大&#xff0c;其處理復雜任務的能力往往越強。 然而&#xff0c;這并不意味著小型模型就永遠無法展現出色的推理性能。最近&#xff0c;奶茶發現了微軟的Orca2公開了…

自動化操作腳本

文章目錄 vbsopenCV pyautogui vbs SSH連接并執行指令操作 Dim WshShell Set WshShellWScript.CreateObject("WScript.Shell") WshShell.Run "cmd.exe" WScript.Sleep 1000 WshShell.SendKeys "ssh xcmg10.27.40.103" WshShell.SendKeys &qu…

xxl-job詳解

目錄 1、xxl-job介紹1.1 xxl-job的原理1.1.1 執行器的注冊和發現1.1.2 調度中心調用執行器 1.2 quartz和xxl-job對比 2、快速入門2.1 下載并啟動2.2 在調度中心新增定時任務2.3 任務運行模式(BEAN、GLUE)2.4 xxl-job的總結 3、后端專屬技術群 1、xxl-job介紹 ? xxl-job是一個…

Python源碼30:海龜畫圖turtle畫紫色的小熊

turtle模塊是一個Python的標準庫之一&#xff0c;它提供了一個基于Turtle graphics的繪圖庫。Turtle graphics是一種流行的繪圖方式&#xff0c;它通過控制一個小海龜在屏幕上移動來繪制圖形。 turtle模塊可以讓您輕松地創建和控制海龜圖形&#xff0c;從而幫助您學習Python編…

Qt12.8

使用手動連接&#xff0c;將登錄框中的取消按鈕使用qt4版本的連接到自定義的槽函數中&#xff0c;在自定義的槽函數中調用關閉函數 將登錄按鈕使用qt5版本的連接到自定義的槽函數中&#xff0c;在槽函數中判斷ui界面上輸入的賬號是否為"admin"&#xff0c;密碼是否為…

lv11 嵌入式開發 中斷控制器14

目錄 1 中斷控制器 ?編輯 2 Exynos4412下的中斷控制器 2.1 概述 2.2 特征 ?編輯 2.3 中斷狀態 2.4 中斷類型 2.5 中斷控制器GIC中斷表 3 中斷控制器寄存器詳解 3.1 ICDDCR&#xff08;Interrupt Controller Distributor Control Register&#xff09; 3.2 ICDISER…

當你還在糾結用什么技術時,這位獨立開發者用PHP和JavaScript實現財務自由了

大家好&#xff0c;我是風箏&#xff0c;微信搜「古時的風箏」&#xff0c;更多干貨 一個個人產品賣了5400萬&#xff0c;這大概就是最成功的獨立開發者了吧 這位獨立開發者是 levelsio&#xff0c;他的真名是 Pieter Levels&#xff0c;是一位荷蘭的獨立開發者。看看人家的工…

WPF DataGrid 動態增加列

方式一&#xff1a;通過DataGrid 數據源即DataTable&#xff0c;在DataTable里面動態增加了列之后&#xff0c;重新構造每一行數據&#xff0c;設置DataGrid.ItemsSource null; 然后再重新設置ItemsSource到DataTable public partial class MainWindow : Window{public MainWi…

【Java基礎系列】Cron表達式入門

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

優秀案例 | 元宇宙雙語財經科技主播“舒望”主持首屆粵港澳大灣區元宇宙國際傳播論壇

12月6日&#xff0c;由南方財經全媒體集團指導、大灣區元宇宙國際傳播實驗室(GBA MIC Lab&#xff09;主辦、南財國際傳播中心和21世紀經濟報道共同承辦&#xff0c;以“多元共創開放共享”為主題的首屆粵港澳大灣區元宇宙國際傳播論壇在廣州隆重開幕。 “立足灣區&#xff0c;…