主頁 >  其他 > Kafka與RocketMQ性能對比大揭秘

Kafka與RocketMQ性能對比大揭秘

2020-12-03 09:26:44 其他

在雙十一程序中投入同樣的硬體資源,Kafka 搭建的日志集群單個Topic可以達到幾百萬的TPS,而使用RocketMQ組件的核心業務集群,集群TPS只能達到幾十萬TPS,這樣的現象激發了我對兩者性能方面的思考,

溫馨提示:TPS只是眾多性能指標中的一個,我們在做技術選型方面要從多方面考慮,本文并不打算就訊息中間件選型方面投入太多筆墨,重點想嘗試剖析兩者在性能方面的設計思想,

1、檔案布局

1.1 Kafka 檔案布局

Kafka 檔案在宏觀上的布局如下圖所示:
在這里插入圖片描述
正如上圖所示,Kafka 檔案布局的主要特征如下:

檔案的組織以 topic + 磁區進行組織,每一個 topic 可以創建多個磁區,每一個磁區包含單獨的檔案夾,并且是多副本機制,即 topic 的每一個磁區會有 Leader 與 Follow,并且 Kafka 內部有機制保證 topic 的某一個磁區的 Leader 與 follow 不會存在在同一臺機器,并且每一臺 broker 會盡量均衡的承擔各個磁區的 Leader,當然在運行程序中如果不均衡,可以執行命令進行手動重平衡,Leader 節點承擔一個磁區的讀寫,follow 節點只負責資料備份,

Kafka 的負載均衡主要依靠磁區 Leader 節點的分布情況,

磁區的 Leader 節點負責讀寫,而從節點負責資料同步,如果Leader磁區所在的Broker節點發生宕機,會觸發主從節點的切換,會在剩下的 follow 節點中選舉一個新的 Leader 節點,其資料的流入流程如下圖所示:
在這里插入圖片描述
磁區 Leader 收到客戶端的訊息發送請求時,是寫入到 Leader 節點后就回傳還是要等到它的從節點全部寫入后再回傳,這里非常關鍵,會直接影響訊息發送端的時延,故 Kafka 提供了 ack 這個引數來進行策略選擇:

  • ack = 0

    不等broker端確認就直接回傳,即客戶端將訊息發送到網路中就回傳發送成功,

  • ack = 1

    Leader 節點接受并存盤后向客戶端回傳成功,

  • ack = -1
    Leader節點和所有的Follow節點接受并成功存盤再向客戶端回傳成功,

1.2 RocketMQ 檔案布局

RocketMQ 的檔案布局如下圖所示:
在這里插入圖片描述
RocketMQ 所有主題的訊息都會寫入到 commitlog 檔案中,然后基于 commitlog 檔案構建訊息消費佇列檔案(Consumequeue),訊息消費佇列的組織結構按照 /topic/{queue} 進行組織,從集群的視角來看如下圖所示:
在這里插入圖片描述
RocketMQ 默認采取的是主從同步,當然從RocketMQ4.5引入了多副本機制,但其副本的粒度為 Commitlog 檔案,上圖中不同 master 節點之間的資料完成不一樣(資料分片),而主從節點節點資料一致,

1.3 檔案布局對比

Kafka 中檔案的布局是以 Topic/partition ,每一個磁區一個物理檔案夾,在磁區檔案級別實作檔案順序寫,如果一個Kafka集群中擁有成百上千個主題,每一個主題擁有上百個磁區,訊息在高并發寫入時,其IO操作就會顯得零散,其操作相當于隨機IO,即 Kafka 在訊息寫入時的IO性能會隨著 topic 、磁區數量的增長,其寫入性能會先上升,然后下降

而 RocketMQ在訊息寫入時追求極致的順序寫,所有的訊息不分主題一律順序寫入 commitlog 檔案,并不會隨著 topic 和 磁區數量的增加而影響其順序性,但通過筆者的實踐來看一臺物理機并使用SSD盤,但一個檔案無法充分利用磁盤IO的性能,

兩者檔案組織方式,除了在磁盤的順序寫方面有所區別后,由于其粒度的問題,Kafka 的 topic 擴容磁區會涉及磁區在各個 Broker 的移動,其擴容操作比較重,而 RocketMQ 資料存盤是基于 commitlog 檔案的,擴容時不會產生資料移動,只會對新的資料產生影響,RocketMQ 的運維成本對 Kafka 更低,

最后 Kafka 的 ack 引數可以類比 RocketMQ 的同步復制、異步復制,

Kafka 的 ack 引數為 1 時,對比 RocketMQ 的異步復制; -1 對標 RocketMQ 的 同步復制,而 -1 則對標 RocketMQ 訊息發送方式的 oneway 模式,

2、資料寫入方式

2.1 Kafka 訊息寫入方式

Kafka 的訊息寫入使用的是 FileChannel,其代碼截圖如下:
在這里插入圖片描述
并且在訊息寫入時使用了 transferTo 方法,根據網上的資料說 NIO 中網路讀寫真正是零拷貝的就是需要呼叫 FileChannel 的 transferTo或者 transferFrom 方法,其內部機制是利用了 sendfile 系統呼叫,

2.2 RocketMQ 訊息寫入方式

RocketMQ 的訊息寫入支持 記憶體映射 與 FileChannel 寫入兩種方式, 示例如下圖所示:
在這里插入圖片描述

2.3 訊息寫入方式對比

盡管 RocketMQ 與 Kafka 都支持 FileChannel 方式寫入,但 RocketMQ 基于 FileChannel 寫入時呼叫的 API 卻并不是 transferTo,而是先呼叫 writer,然后定時 flush 刷寫到磁盤,其代碼截圖如下:
在這里插入圖片描述
為什么 RocketMQ 不呼叫 transerTo 方法呢,個人覺得和 RocketMQ 需要在 Broker 組裝 MQ 訊息格式有關,需要從網路中解碼請求,傳輸到堆記憶體,然后對訊息進行加工,最終持久化到磁盤相關,

從網上查詢資料中大概傾向于這樣一個 觀點:sendfile 系統呼叫相比記憶體映射多了一次從用戶快取區拷貝到內核快取區,但對于超過64K的記憶體寫入時往往 sendfile 的性能更高,可能是由于 sendfile 是基于塊記憶體的,

3、訊息發送方式

3.1 Kafka 訊息發送機制

Kafka 在訊息發送客戶端采用了一個雙端佇列,引入了批處理思想,其訊息發送機制如下圖所示:
在這里插入圖片描述
客戶端通過呼叫 kafka 的訊息發送者發送訊息時,訊息會首先存入到一個雙端佇列中,雙端佇列中單個元素為 ProducerBatch,表示一個發送批次,其最大大小受引數 batch.size 控制,默認為 16K,然后會單獨開一個 Send 執行緒,從雙端佇列中獲取一個發送批次,將訊息按批發送到 Kafka集群中,這里引入了 linger.ms 引數來控制 Send 執行緒的發送行為,

為了提高 kafka 訊息發送的高吞吐量,即控制在快取區中未積滿 batch.size 時來控制訊息發送執行緒的行為,是立即發送還是等待一定時間,如果linger.ms 設定為 0表示立即發送,如果設定為大于0,則訊息發送執行緒會等待這個值后才會向broker發送, linger.ms 引數者會增加回應時間,但有利于增加吞吐量,有點類似于 TCP 領域的 Nagle 演算法

Kafka 的訊息發送,在寫入 ProducerBatch 時會按照訊息存盤協議組織好資料,在服務端可以直接寫入到檔案中,

3.2 RocketMQ 訊息發送機制

RocketMQ 訊息發送在客戶端主要是根據路由選擇演算法選擇一個佇列,然后將訊息發送到服務端,訊息會在服務端按照訊息的存盤格式進行組織,然后進行持久化等操作,

3.3 訊息發送對比

Kafka 在訊息發送方面比 RokcetMQ 有一個顯著的優勢就是訊息格式的組織是發生在客戶端,這樣會有一個大的優勢節約了 Broker 端的CPU壓力,客戶端“分布式”的承接了其優勢,其架構方式有點類似 shardingjdbc 與 MyCat 的區別,

Kafka 在訊息發送端另外一個特點是引入了雙端快取佇列,Kafka 無處不在追求批處理,這樣顯著的特點是能提高訊息發送的吞吐量,但與之帶來的是增大訊息的回應時間,并且帶來了訊息丟失的可能性,因為 Kafka 追加到訊息快取后會回傳成功,如果訊息發送方例外退出,會帶來訊息丟失,

Kafka 中的 linger.ms = 0 可類比 RocketMQ 訊息發送的效果,

但 Kafka 通過提供 batch.size 與 linger.ms 兩個引數按照場景進行定制化,比 RocketMQ 靈活,

例如日志集群,通常會調大 batch.size 與 linger.ms 引數,重復發揮訊息批量發送機制,提高其吞吐量;但如果對一些回應時間比較敏感的話,可以適當減少 linger.ms 的值,

4、總結

從上面的對比來看,Kafka 在性能上綜合表現確實要比 RocketMQ 更加的優秀,但在訊息選型程序中,我們不僅僅要參考其性能,還有從功能性上來考慮,例如 RocketMQ 提供了豐富的訊息檢索功能、事務訊息、訊息消費重試、定時訊息等,

筆者個人認為通常在大資料、流式處理場景基本選用 Kafka,業務處理相關選擇 RocketMQ,


好了,本文就介紹到這里了,您的點贊與轉發是對我持續輸出高質量文章最大的鼓勵,

歡迎加筆者微信號(dingwpmz),拉您如技術交流加群探討,筆者優質專欄目錄:
1、原始碼分析RocketMQ專欄(40篇+)
2、原始碼分析Sentinel專欄(12篇+)
3、原始碼分析Dubbo專欄(28篇+)
4、原始碼分析Mybatis專欄
5、原始碼分析Netty專欄(18篇+)
6、原始碼分析JUC專欄
7、原始碼分析Elasticjob專欄
8、Elasticsearch專欄(20篇+)
9、原始碼分析MyCat專欄
10、原始碼分析 Canal

唯有堅持不懈 CSDN認證博客專家 RocketMQ 資深架構師 中間件興愛好者
丁威,《RocketMQ技術內幕》作者、CSDN博客專家,原創公眾號『中間件興趣圈』維護者,目前就職于中通快遞研發中心擔任資深架構師,負責訊息中間件與全鏈路壓測的實施與落地,擅長JAVA編程,對主流中間件RocketMQ、Dubbo、ElasticJob、Netty、Sentienl、Mybatis、Mycat等中間件有深入研究,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/229133.html

標籤:其他

上一篇:2015到2020JAVA架構技術演進,阿里架構師到底有多牛逼?

下一篇:本人香樟精英經驗分享會部分經驗

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more