kafka詳解(二)--kafka為什麼快

来源:https://www.cnblogs.com/ZhangZiSheng001/archive/2022/10/13/16788561.html
-Advertisement-
Play Games

Kafka 有多快呢?我們可以使用 OpenMessaging Benchmark Framework 測試框架方便地對 RocketMQ、Pulsar、Kafka、RabbitMQ 等消息系統進行對比測試,因為暫時沒有測試條件(後續補上),我直接用這篇文章的測試結果(Benchmarking Ka... ...


前言

Kafka 有多快呢?我們可以使用 OpenMessaging Benchmark Framework 測試框架方便地對 RocketMQ、Pulsar、Kafka、RabbitMQ 等消息系統進行對比測試,因為暫時沒有測試條件(後續補上),我直接用這篇文章的測試結果(Benchmarking Kafka vs. Pulsar vs. RabbitMQ: Which is Fastest?),可以看到,在某種條件下,Kafka 寫入速度比 RabbitMQ 快 15 倍,比 Pulsar 快 2 倍,在最高吞吐量下仍保持低延遲。

throughput-and-latency-quantiles

那麼,為什麼 Kafka 可以那麼快呢?這裡我先簡單總結,後面會展開分析。

  1. 從磁碟中順序讀寫 event
  2. 通過批處理減少大量小 I/O
  3. 從文件到 socket 之間數據零拷貝
  4. 基於分區的橫向擴展

ps:[本系列](博客後臺 - 博客園 (cnblogs.com))博客將持續更新。

順序讀寫磁碟

Kafka 嚴重依賴文件系統來讀寫 event。我們不禁會問,磁碟不是很慢嗎?Kafka 真的能提供很好的性能嗎?

事實上,磁碟比人們預期的要慢得多,也快得多,這取決於它們的使用方式。在這篇文章中(ACM Queue article)可以發現,在某些情況下,順序磁碟訪問可能比隨機記憶體訪問更快。這要得益於現代操作系統對磁碟讀寫進行的大量的優化,包括 read-ahead 和 write-behind 技術,當我們順序讀取磁碟時,更多時候訪問的不是磁碟,而是記憶體--pagecache。

jacobs3.jpg

因此,只要順序訪問文件系統,磁碟也可以很快。Kafka 的 event 組織方式以及應用場景,天然地支持了順序讀寫,並且 Kafka 也為此做了許多努力,例如批處理、追加寫入等。

此外,相比主動將 event 維護在記憶體,採用文件系統還有以下好處:

  1. 可以緩存更多的數據。在 JVM 中,維護對象的記憶體開銷將是實際數據大小的兩倍甚至更糟,隨著堆內數據的增加,gc 將愈發頻繁。而使用文件系統可以在 pagecache 中緩存更多更緊湊的數據,而不需要考慮 gc 問題。

  2. 重啟後恢復更快。由於數據緩存在 pagecache,進程重啟,這部分緩存仍然可以保持 warn 的狀態,如果在進程記憶體中維護這些數據的話,每次啟動都需要重建(對於 10GB 緩存可能需要 10 分鐘)。

  3. 數據不會丟失。如果數據維護在記憶體中,需要考慮定期將數據持久化到磁碟,一致性和性能的權衡將是一個比較麻煩的問題,即便如此,我們也不能保證數據不會丟失,例如 redis 可能損失幾秒的數據,甚至更多。在理論上,Kafka 就不會出現數據丟失的情況。

  4. 大大簡化了代碼。用於維護緩存和文件系統之間一致性的所有邏輯現在都在操作系統中,而操作系統往往更高效、更正確。

通過批處理減少小I/O

小 I/O 操作發生在客戶端和服務端之間的數據傳輸以及服務端自身的持久化操作。

為了避免小 I/O 操作,Kafka 是以批的形式來操作 event,而不是一次發送一條消息。producer 會嘗試在記憶體中積累數據,併在單個請求中發送更大的批,當然,這種方式是犧牲少量額外延遲以獲得更好的吞吐量,我們可以配置累積數量和等待時間來平衡。同理,consumer 讀取數據時也會嘗試一次讀取更多。

批處理可以產生較大順序磁碟操作和連續記憶體塊,不過也產生了較大的網路數據包,相應地,Kafaka 會將消息壓縮後發送,當消息寫入日誌時仍然是壓縮形式,僅由使用者解壓縮。

數據零拷貝

另一個問題是過多的位元組複製。//zzs001

一般情況下,數據從文件傳輸到 socket 的數據路徑為:磁碟 -》內核的 pagecache -》用戶空間緩衝區 -》內核的 socket 緩衝區 -》NIC 緩衝區。

figure1.gif

顯然,這是非常低效的,有四個副本和兩個系統調用。Kafka 使用 sendfile,允許操作系統將數據從 pagecache 直接發送到網路,即磁碟 -》內核的 pagecache-》NIC 緩衝區。從而避免這種重覆複製和系統調用。更多關於 sendfile 的內容可以參考Efficient data transfer through zero copy

figure5.gif

需要註意的是,由於 TLS/SSL 庫是工作在用戶空間的,所以,當啟用了 SSL,sendfile 將不能使用。

基於分區的橫向擴展

關於這一點,在上一篇博客中其實已經提到過。首先,一個 topic 會劃分成一個或多個 partition,這些 partition 一般分佈在不同的 broker 實例。producer 發佈的 event 會根據某種策略分配到不同的 partition,這樣做的好處是,consumer 可以同時從多台 broker 讀取 event,從而大大提高吞吐量。另外,為了高可用,同一個 partition 還會有多個副本,它們分佈在不同的 broker 實例,和很多傳統的消息系統不同,Kafka 的副本是可讀的,即 consumer 不僅可以從主 partition 讀取 event,也可以從副本讀取。//zzs001

zzs_kafka_fast_01

結語

以上內容是最近學習 Kafka 的一些思考和總結(主要參考官方文檔),如有錯誤,歡迎指正。

任何的事物,都可以被更簡單、更連貫、更系統地瞭解。希望我的文章能夠幫到你。

最後,感謝閱讀。

參考資料

Apache Kafka 官方文檔

Benchmarking Kafka vs. Pulsar vs. RabbitMQ: Which is Fastest?

The OpenMessaging Benchmark Framework

The Pathologies of Big Data - ACM Queue

Efficient data transfer through zero copy - IBM Developer

相關源碼請移步:https://github.com/ZhangZiSheng001/kafka-demo

本文為原創文章,轉載請附上原文出處鏈接:https://www.cnblogs.com/ZhangZiSheng001/p/16788561.html

分層,抽象,高內聚,低耦合
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 數組操作 1. 數組和 for 迴圈不得不說的秘密 數組是一個連續數據存儲空間,同時帶有下標性質操作,下標範圍是 0 ~ 數組容量 - 1 ==> 利用迴圈來進行操作。 // 利用 for 迴圈給予數組中的每一個元素進行賦值操作 // 利用 for 迴圈展示數組中的每一個元素數據存儲內容 class ...
  • Kafka介紹 Kafka是最初由Linkedin公司開發,是一個分散式、支持分區的(partition)、多副本的(replica),基於zookeeper協調的分散式消息系統,它的最大的特性就是可以實時的處理大量數據以滿足各種需求場景:比如基於hadoop的批處理系統、低延遲的實時系統、Stor ...
  • JDBC和連接池01 1.JDBC概述 基本介紹 JDBC為訪問不同的資料庫提供了同一的介面,為使用者屏蔽了細節問題 Java程式員使用JDBC,可以連接任何提供了jdbc驅動程式的資料庫系統,從而完成對資料庫的各種操作 jdbc原理圖 JDBC是java提供的一套用於資料庫操作的介面API,Jav ...
  • 大數階乘的由來 一個正整數的階乘(Factorial)是所有小於及等於該數的正整數的積,並且0的階乘為1。自然數n的階乘寫作n!。亦即n!=1×2×3×...×(n-1)×n。階乘亦可以遞歸方式定義:0!=1,n!=(n-1)!×n。 但是在求解數字較大的階乘時,由於階乘累乘的性質,導致結果過大,在 ...
  • Python地圖柵格化實例 引言 shapefile是GIS中的一種非常重要的數據類型,由ESRI開發的空間數據開放格式,目前該數據格式已經成為了GIS領域的開放標準。目前絕大多數開源以及收費的GIS軟體都支持該數據類型。事實上,shapefile文件指的一種文件存儲的方法,實際上該種文件是由多個文 ...
  • 前言 嗨嘍~大家好呀,這裡是魔王吶 ! 滑雪運動(特別是現代競技滑雪)發展到當今,項目不斷在增多,領域不斷在擴展。 世界比賽正規的大項目分為:高山滑雪、北歐滑雪(Nordic Skiing,越野滑雪、跳台滑雪)、自由式滑雪、冬季兩項滑雪、雪上滑板滑雪等。 純競技滑雪具有鮮明的競爭性、專項性,相關條件 ...
  • Tabby的功能有很多,首先它是支持多平臺的,就像java一樣;其次,它是開源的,拿來就用;最後,它擁有酷炫的界面以及支持網頁連接Linux,是不是感覺瞬間高大上了呢? ...
  • 前言 當你編輯一個PDF文檔時,有時需要刪除文檔中多餘的頁面或向文檔中添加新的頁面。本文將向您演示如何使用Spire.PDF for Java在PDF文檔中添加或刪除頁面。 程式環境 安裝Spire.PDF for Java 首先,你需要在你的Java程式中添加Spire.Pdf.jar文件作為一個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...