消息隊列性能比拼: Kafka vs RabbitMQ

本內容是對知名性能評測博主 Anton Putra Kafka vs RabbitMQ Performance 內容的翻譯與整理, 有適當刪減, 相關數據和結論以原作結論為準。

簡介

在本視頻中,我們將首先比較 Apache Kafka 和傳統的 RabbitMQ。然后,在第二輪測試中,會將 KafkaRabbitMQ Streams 進行對比,后者在架構和使用場景上更接近 Kafka(RabbitMQ Streams 是一個相對較新的項目,旨在直接與 Kafka 競爭)。

與往常一樣,我們將關注 四大核心指標

  1. 吞吐量(Throughput) ---每秒消息數(Messages per second) 衡量。
  2. 延遲(Latency) --- 追蹤每條消息的發送和接收所需時間。
  3. 系統負載(Saturation) --- 包括 CPU 使用率(相對于虛擬機的 CPU 限制)、內存使用情況,以及 磁盤操作(因為 Kafka 采用追加式日志,需要將每條消息存儲到磁盤)。
  4. 客戶端 CPU 負載 --- 統計所有發送和接收消息的客戶端的平均 CPU 使用率

為了運行這些測試,我使用了 AWS。消息代理部署在 i3en.large 規格的實例上,而客戶端則運行在 EKS 集群Graviton 實例 上。老實說,這次測試成本不低---要讓一個Kafka 代理崩潰,需要消耗大量計算資源。


測試設計

首先,我會快速講解 KafkaRabbitMQ

Kafka 中,最常用的消息協議之一是 RPC 消息,它采用 二進制格式,相比 JSON 消息 體積更小。這不僅降低了消息代理的負載,還提高了 延遲吞吐量指標。此外,你可以在 gRPC服務間通信(Service-to-Service Communication) 中復用這些消息。

在本次測試中,我使用 Device RPC 消息,它包含以下字段:

  • UUID(設備唯一標識符)
  • MAC 地址
  • 固件版本
  • 設備創建的時間戳

你可以在我的 GitHub 公開倉庫 中找到源代碼。

測試流程
  1. 在生產者端,我們使用 隨機設備數據 生成 Device RPC 消息,并記錄當前時間戳。
  2. 然后,我們 同時 將該消息發送到 Kafka 的TopicRabbitMQ 隊列(Queue)
  3. 在消費者端,收到消息后,我們從 created_at 字段中提取時間戳,并計算 消息延遲

注意:我們不依賴 Kafka 或 RabbitMQ 內部指標 來測量延遲,而是直接在 客戶端 端測量,這樣測試方式對兩者是 公平且準確 的。

如果你認為 測試設計客戶端源碼 可以優化,歡迎提出建議或提交 Pull Request




第一輪測試:Kafka vs. 傳統 RabbitMQ

讓我們開始第一輪測試,比較 Kafka傳統 RabbitMQ(后者主要將消息存儲在 內存 中)。

剛開始,你就會注意到:

  • RabbitMQ 的消息發送和接收延遲比 Kafka 低近一半。這對于某些應用場景可能至關重要,也可能無關緊要,但總體來說,RabbitMQ 的延遲更低

  • 右側圖表 顯示了每個消息系統每秒 處理的消息數

  • Kafka 的 CPU 使用率更高,因為它必須將 每一條消息寫入磁盤

  • 左側圖表 顯示 Kafka 正在 頻繁進行磁盤寫入,而 RabbitMQ 幾乎不訪問磁盤(甚至完全不觸碰磁盤)。



另一個重要點:Kafka 的 生產者消費者CPU 使用率 約為 RabbitMQ 客戶端的兩倍

Kafka 的 CPU 使用率達到 50% 時,延遲開始顯著上升。也就是說,當 Kafka 的 CPU 超過 50% 時,其延遲會開始惡化,如果你對低延遲有嚴格要求,這一點需要特別注意。

RabbitMQ 的極限

  • 當 RabbitMQ 處理達到 15,000 條消息/秒 時,CPU使用率達到 100% ,開始 崩潰,延遲急劇上升。
  • 當 RabbitMQ 處理達到 33,000 條消息/秒 時,生產者和消費者 超時(默認超時 5 秒),開始 請求失敗。這意味著 RabbitMQ 的最大吞吐量約為 33,000 條消息/秒
Kafka 的極限

  • Kafka 的 CPU 在更早的階段就達到了 100%,但它 仍然能夠繼續處理 所有消息。盡管 延遲增加,但 Kafka 仍 持續運作

  • 繼續推高負載,我們發現 Kafka 在 230,000 條消息/秒 時達到極限

接下來,我們打開每個圖表,分析整個測試過程的數據。

數據分析

第一輪測試(Kafka vs. RabbitMQ)

  • 吞吐量:Kafka 遠超 RabbitMQ。

  • 延遲:RabbitMQ 低得多,這也是 選擇 RabbitMQ 的主要原因

  • 磁盤操作:(本次測試)Kafka 依賴 本地 SSD,提高了性能。

  • CPU 使用率:雖然Kafka使用了更多的CPU,但 即使達到 100% CPU 仍能持續運行,而不會像 RabbitMQ 那樣CPU到達100%很快失敗(因為RabbitMQ主要將數據存儲在內存中?)。

  • 客戶端的CPU使用情況:

  • 內存使用:RabbitMQ CPU 100% 時,內存使用發生尖峰




第二輪測試:Kafka vs. RabbitMQ Streams

在第二輪測試中,我們對比 KafkaRabbitMQ Streams

  • 一開始,RabbitMQ Streams 的延遲就明顯更高
  • 我使用了 官方 Golang 庫,它采用 RabbitMQ Streams 專用的二進制協議
  • 這次,RabbitMQ 從一開始就開始寫入磁盤,但其 CPU 使用率在測試初期遠低于 Kafka

RabbitMQ Streams 的極限
  • Kafka 在 12,000 條消息/秒 時 CPU 達到 100% ,延遲開始上升。

  • RabbitMQ 的 CPU 此時只有 15% ,我推測這是因為 RabbitMQ 處理每條消息的延遲較高

  • 當 RabbitMQ 處理達到 100,000 條消息/秒 時,CPU 100% ,并且性能進一步下降。

  • 當 RabbitMQ 處理達到 135,000 條消息/秒 時,徹底失敗
Kafka 的極限
  • 我繼續增加 Kafka 的負載,最終 Kafka 在 272,000 條消息/秒 時崩潰

接下來,我們打開所有圖表,逐項分析數據。


數據分析

第二輪測試(Kafka vs. RabbitMQ Streams)

  • RabbitMQ Streams 的吞吐量(和第一次測試所用的RabbitMQ相比)有所提升,但 整體速度比 Kafka 慢

  • RabbitMQ Streams 的延遲極高,只適用于 批量數據處理或非延遲敏感的場景,不適用于 低延遲應用

  • 每秒磁盤寫入操作的次數:

  • CPU使用情況:

  • 客戶端的平均CPU使用情況:

  • 內存使用情況:






結論

  • 如果你需要低延遲,并且 RabbitMQ 滿足你的需求,那就選 RabbitMQ
  • 如果你需要高吞吐量、穩定性和可擴展性,Kafka 是更好的選擇
  • 在第二輪測試中,Kafka 明顯勝出

如果你有更好的 RabbitMQ Streams 優化方案,歡迎分享,我愿意做 更新測試

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

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

相關文章

打磨和修改:字帖自動生成

功能增加一些。 一個人和大語言模型對話的結果。 不過是重復性勞動,特別需要創意的地方還是不容易做到。

電腦干貨:萬能驅動--EasyDrv8

目錄 萬能驅動EasyDrv8 功能介紹 主程序界面 驅動解壓與安裝 PE環境支持 系統部署環境 桌面環境一鍵解決方案 萬能驅動8電腦版是由IT天空出品的一款智能識別電腦硬件并自動安裝驅動的工具,一般又稱為it天空萬能驅動,萬能驅動vip版,簡稱…

LeetCode熱題100JS(79/100)第十五天|347|295|121|55|45

347. 前 K 個高頻元素 題目鏈接:347. 前 K 個高頻元素 難度:中等 刷題狀態:1刷 新知識: 解題過程 思考 示例 1: 輸入: nums [1,1,1,2,2,3], k 2 輸出: [1,2] 沒思路,看答案 題解分析 參考題解鏈接&#xff1a…

Sentinel 限流利器(功能以及源碼解析)

Sentinel簡介 Sentinel是阿里開源的一款面向分布式、多語言異構化服務架構的流量治理組件。 主要以流量為切入點,從流量路由、流量控制、流量整形、熔斷降級、系統自適應過載保護、熱點流量防護等多個維度來幫助開發者保障微服務的穩定性。 核心概念 資源 資源是…

子數組 之 logTrick算法,求解或,與,LCM,GCD

文章目錄 gcd的問題最大公約數 求解子數組的&,|,lcm,gcd的最值or計數問題,如果采用暴力的做法,那么時間復雜度會來到o(n^2),其實在求解的過程中,會出現很多的結果不變的情況,所以我們就可以提前結束 存在一定的單調性&#x…

How to use pgbench to test performance for PostgreSQL?

pgbench 是一個用于測試 PostgreSQL 數據庫性能的基準測試工具。通過模擬多個客戶端并發執行 SQL 查詢,它可以幫助你評估數據庫的性能。以下是使用 pgbench 的基本步驟: 安裝 pgbench pgbench 是 PostgreSQL 的一部分,因此在安裝 PostgreSQ…

應用服務接口第二次請求一直pending問題

目錄 一、問題背景二、問題排查過程三、解決方案四、總結 一、問題背景 升級內容發布到灰度環境,驗證相關服務,查看接口調用日志,發現第一次請求正常,第二次相同接口請求就一直pending,其他服務也是如此 二、問題排查…

嵌入式八股RTOS與Linux---網絡系統篇

前言 關于計網的什么TCP三次握手 幾層模型啊TCP報文啥的不在這里講,會單獨分成一個計算機網絡模塊 ??這里主要介紹介紹lwip和socket FreeRTOS下的網絡接口–移植LWIP 實際上FreeRTOS并不自帶網絡接口,我們一般會通過移植lwip協議棧讓FreeRTOS可以通過網絡接口收發數據,具體可…

推薦一款好看的 vue3 后臺模板

SoybeanAdmin 項目簡介 SoybeanAdmin 是一個基于最新前端技術棧的清新、優雅、高顏值且功能強大的后臺管理模板。它采用 Vue3, Vite5, TypeScript, Pinia, NaiveUI 和 UnoCSS 構建,為開發者提供了一個現代化、高效且易于擴展的后臺管理系統解決方案。 主要特點&am…

【django】1-1 django構建web程序的基礎知識

文章目錄 1 構建web應用的基礎知識1.1 互聯網相關的概念1.2 互聯網協議DNS(域名系統)IP協議(互聯網絡協議)TCP(傳輸控制協議)HTTP(超文本傳輸協議)SSL(安全套接字層)TLS(傳輸層安全) 1.3 URL 2 web程序2.1 web程序的本質2.2 web框架的設計模式1.2.1 經典的MVC設計模式1.2.2 Dja…

【智能體】從一個聊天工作流了解LangGraph

1. 前言 這篇文章將從如何搭建一個帶網絡搜索功能的聊天機器人工作流,帶你初步了解 LangGraph。 2. 前提條件 已搭建 Python 開發環境,使用 3.11 以上版本。 已熟悉 Python 基礎語法。可參考:【LLM】Python 基礎語法_llm python入門-CSDN博…

JAVA開發:實例成員與靜態成員

判斷Java中的實例成員與靜態成員 在Java中,可以通過以下幾種方式判斷一個成員是實例成員還是靜態成員: 1. 通過聲明方式判斷 靜態成員使用static關鍵字修飾,實例成員不使用: public class MyClass {// 實例成員int instanceVa…

Softmax 回歸 + 損失函數 + 圖片分類數據集

Softmax 回歸 softmax 回歸是機器學習另外一個非常經典且重要的模型,是一個分類問題。 下面先解釋一下分類和回歸的區別: 簡單來說,分類問題從回歸的單輸出變成了多輸出,輸出的個數等于類別的個數。 實際上,對于分…

MySQL-存儲過程

介紹 基本語法 創建 調用 查看 刪除 變量 系統變量 查看 設置 用戶定義變量 賦值 使用 局部變量 聲明 賦值 流程控制 參數 條件結構 IF case 循環結構 while repeat loop 游標 條件處理程序 介紹 舉個簡單的例子,我們先select某數據&…

使用 Go 和 Gin 實現高可用負載均衡代理服務器

前言 在現代分布式系統中,負載均衡是保障服務高可用性和性能的核心技術。本文將基于 Go 語言和 Gin 框架實現一個支持動態路由、健康檢查、會話保持等特性的企業級負載均衡代理服務器,并提供完整的壓力測試方案和優化建議。 通過本方案實現的負載均衡代理具備以下優勢: 單…

在 Linux(Ubuntu / CentOS 7)上快速搭建我的世界 MineCraft 服務器,并實現遠程聯機,詳細教程

Linux 部署 MineCraft 服務器 詳細教程(丐版,無需云服務器) 一、虛擬機 Ubuntu 部署二、下載 Minecraft 服務端三、安裝 JRE 21四、安裝 MCS manager 面板五、搭建服務器六、本地測試連接七、下載櫻花,實現內網穿透,邀…

批量取消 PDF 文檔中的所有超鏈接

在 PDF 文檔中我們可以插入各種各樣的文本也可以給文本設置字體,顏色等多種樣式,同時還可以給文字或者圖片添加上超鏈接,當我們點擊超鏈接之后,就會跳轉到對應的網頁。有時候這會對我們的閱讀或者使用形成一定的干擾,今…

Ubuntu xinference部署本地模型bge-large-zh-v1.5、bge-reranker-v2-m3

bge-large-zh-v1.5 下載模型到指定路徑: modelscope download --model BAAI/bge-large-zh-v1.5 --local_dir ./bge-large-zh-v1.5自定義 embedding 模型,custom-bge-large-zh-v1.5.json: {"model_name": "custom-bge-large…

Vue的實例

Every Vue application starts with a single Vue component instance as the application root. Any other Vue component created in the same application needs to be nested inside this root component. 每個 Vue 應用都以一個 Vue 組件實例作為應用的根開始。在同一個應…

Linux學習筆記(應用篇三)

基于I.MX6ULL-MINI開發板 LED學習GPIO應用編程輸入設備 開發板中所有的設備(對象)都會在/sys/devices 體現出來,是 sysfs 文件系統中最重要的目錄結構 /sys下的子目錄說明/sys/devices這是系統中所有設備存放的目錄,也就是系統中…