主頁 >  其他 > Spring Cloud Alibaba - 訊息佇列(四)(RocketMQ原始碼解讀 / NameServer | Broker | Producer | Consumer)(目前存在的不足之處)

Spring Cloud Alibaba - 訊息佇列(四)(RocketMQ原始碼解讀 / NameServer | Broker | Producer | Consumer)(目前存在的不足之處)

2021-02-10 11:33:35 其他

RocketMQ 4.7.1原始碼決議/吐槽

    • 前言
      • 槽點一(檔案)
      • 槽點二(springboot版本)
      • 槽點三(對Spring-cloud-stream支持低)
      • 槽點四(向IE看起???版本不穩定/源代碼注釋少的可憐)
      • 原始碼下載
    • 正文
      • NameServer
      • Broker
        • 啟動
        • 注冊
      • Producer
        • 啟動
        • 發送訊息
      • Consumer
        • 訊息獲取
        • 負載均衡
      • END

前言

距離上次發布 RocketMQ 的博文已經有六個月的時間了,中間從有開始想寫原始碼的念頭,動手到現在斷斷續續的寫完花了也有三個多月時間,具體為啥會寫那么久,主要是因為,最終 RocketMQ 被我放棄,更改使用 RabbitMq了在這里插入圖片描述

為啥放棄 RocketMQ ? 我稍微吐槽一下好了 ╮(╯_╰)╭

最開始決定使用 RocketMQ 是基于以下幾點考慮:

  • 這是阿里生態的一部分
  • 支撐過雙十一的考驗
  • 和 Kafka 與 RabbitMQ 相比,適用的場景更為全面,并且支持事務
  • 近期文章有許多于其相關的影子,證明了它的活躍度不斷上升,做為技術人當然有必要站在技術的最前沿
  • 國產咱必須得支持

槽點一(檔案)

為啥最終放棄了呢 ╮(╯▽╰)╭ 且不說它還有開源版和商業版之分,這邊以開源版為例,

因為,專案都更新到 4.7.1 了(現在已經是4.8.0),然而官方的檔案寫的真的是…無力吐槽了…((/- -)/,就跟沒人維護一樣,撰寫的版本還是 4.3.0的在這里插入圖片描述
我也是看著看著覺得不對勁,最終才發現這個問題!!!

槽點二(springboot版本)

還有一些 " 小 " 問題 …( _ _)ノ|壁

比如:

微服務都以 spring boot 為驅動,目的是為了簡化配置快速開發,RocketMQ 自然也有 對應的 spring Boot 包,但是!里面對應依賴的springBoot的版本都偏低,所以,還需要自己排除相對應依賴,

		<groupId>org.apache.rocketmq</groupId>
        <artifactId>rocketmq-spring-boot-starter</artifactId>
        <version>2.1.1</version>

里面對應依賴springBoot版本是2.0.5,所以需要排除自己加上新的版本依賴,

 			<exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-webmvc</artifactId>
                </exclusion>
            </exclusions>

槽點三(對Spring-cloud-stream支持低)

再比如:

spring 社區對所有MQ進行了高度的抽象,推出了一個統一的訊息驅動框架,目的是為了呼叫的時候不同太關注于技術,只需要關注于業務邏輯,那么MQ是使用哪一種就對業務沒有任何影響,以下就是官方鏈接,

https://spring.io/projects/spring-cloud-stream

在這里插入圖片描述

天啊,竟然有那么好的東西!何愁專案延期!!何愁大局不穩!!何愁江山不定!!!
在這里插入圖片描述
剛想拿過來用,發現!!!!!

在這里插入圖片描述
官方目前只封裝了kafka、kafka Stream、RabbitMQ的具體依賴,其它是需要廠家自己去維護的,然而,這群阿里的大神,貌似目前看來,并不熱衷于維護它,包括檔案也是,都是十分陳舊的!!!!

目前 rocketMq stream 最新版本是 2.2.5

			<groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
            <version>2.2.5.RELEASE</version>

但是它依賴的rocketmq-client版本還是4.4.0

在這里插入圖片描述

在這里插入圖片描述

槽點四(向IE看起???版本不穩定/源代碼注釋少的可憐)

不得不說,版本迭代還是很快的,但是你也不能改動那么大啊,新版本對比舊版本源代碼變了許多,有點 看IE的感覺!!!

由于官方檔案寫的不好,版本又舊,社區又不算太活躍,所以只能自己去看源代碼,但是!!!!天啊 ,注釋呢!!!不寫注釋你不是耍流氓嗎,瞧瞧spring原始碼雖然也沒怎么看懂,但是人家注釋還是有的!!!
在這里插入圖片描述
由于以上總總原因,開發成本略高,專案又緊,迫不得已,改用 RabbitMQ進行開發,
在這里插入圖片描述

原始碼下載

當初剛開始撰寫RocketMQ系列的時候,最新的代碼是4.71,但是最近新版本是4.8.0,由于博主之前都以4.7.1作為研究,所以本篇博文以4.7.1進行講解,

官方網址以及下載安裝前面的博文已經進行了詳細的描述,所以這邊僅僅附上4.7.1的原始碼下載連接,

https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.7.1/rocketmq-all-4.7.1-source-release.zip

正文

以下對于原始碼的理解是基于官方檔案案例以一些參考資料,若有理解錯的地方歡迎大家指出來,

NameServer

先附上一張大致講解圖(感覺不是很好看,可是我的美術造詣也就這水平了 ( ̄_, ̄ ) )

在這里插入圖片描述

代碼詳解
在這里插入圖片描述
NameServer 的啟動是通過 NamesrvStartup 的 main 方法進行啟動,而 main 方法主要做了兩件事

  1. 創建NamesrvController
  2. 啟動

那么接下來就進行跟蹤分析,
首先看一下創建NamesrvController做了什么事?
在這里插入圖片描述
在這里插入圖片描述
其中快取資訊registerConfig具體操作如下:
在這里插入圖片描述

Controller中的configuration是在new的時候,在構造器中生成,其中的allConfigs也是創建的時候生成,
在這里插入圖片描述

在這里插入圖片描述

創建 NamesrvController 就如上所示,那么接下來看start操作,

在這里插入圖片描述
總共做了兩件事,第一件初始化引數,第二件宣告關閉事件,關閉的時候會關閉定時任務和執行緒池等,所以關閉的時候用它的 showdown 會比 kil l-9 優雅
在這里插入圖片描述

接下來關注初始化事件,
在這里插入圖片描述
初始化事件做的事情不多,其中移除不存活的Broker還有點意思,其它就沒什么了(那個博主沒看懂的除外)
在這里插入圖片描述

至此,NameServer 的 啟動撰寫完畢

Broker

繼續附上一張大大大圖

在這里插入圖片描述

代碼詳解:

啟動

在這里插入圖片描述
Broker 的啟動也是根據 BrokerStartup 的 main 方法進行,主要做了兩件事:

  1. 創建 BrokerController
  2. 啟動

先看一下 BrokerController 創建的時候做了什么事

在這里插入圖片描述
這邊和 NameServer 有一點最大的差別,它多了一種配置 NettyClientConfig ,之所以會多了一個配置,是因為在使用事務訊息模式的時候,他事可以當做客戶端的,

在這里插入圖片描述

在這里插入圖片描述
這邊倒是沒有什么好關注的,主要看看初始化時候做了什么事

在這里插入圖片描述

看一下加載磁盤資料做了什么?

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

我們接著往下看
在這里插入圖片描述
但是還是有一個定時器是可以研究一下的,就是那個可以寫sql的過濾 tag
在這里插入圖片描述
既然這邊有個定時器,持久化filter,那么就代表 filter 是在Broker中進行的,所以它的效率才會那么高!!!

注冊

注冊是在創建完Controller后的啟動中進行的
在這里插入圖片描述

整個start就做了這一件核心事
在這里插入圖片描述
在這里插入圖片描述
先看找尋Broker的代碼

在這里插入圖片描述
當回圈完所有的Broker,逐一進行判斷后,在呼叫后面 doRegisterBrokerAll 進行注冊(中間找的代碼看不懂!!!)
在這里插入圖片描述
到此,關于 Broker 啟動,博主能看懂的都描述完畢,

Producer

生產者的代碼主要包含兩個部分,一個是啟動,一個是發送訊息

老規矩,先上圖:
在這里插入圖片描述

啟動

先說說啟動干了啥:

在這里插入圖片描述
皮一下,很開心 <( ̄︶ ̄)>

在這里插入圖片描述

在這里插入圖片描述
這里是各種組件的初始化,底層運用到相當多的netty的相關知識,有興趣的可以自行查看,

發送訊息

在這里插入圖片描述

在這里插入圖片描述
核心的關鍵步驟就以上三點,

先看如何獲取到訊息佇列:

在這里插入圖片描述

接著再看如何發送訊息:

在這里插入圖片描述

從NameServer 找尋 Broker地址,是更新快取再從快取中獲取
在這里插入圖片描述
在發送Netty請求時,實際上是指定的MessageQueue,而不是Topic,Topic只是用來找 MessageQueue ,

Consumer

消費者也是兩部分,一部分啟動,然后啟動時運行組件進行資料的消費,散亂東西有點多,圖不好畫,那我就簡單畫??ヾ(≧?≦*)ゝ

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
客戶端是否順序消費就在于此實體化,

在這里插入圖片描述
啟動的核心代碼中,初始化了許多的組件,但是與我們使用關聯性比較高的是負載均衡和具體的訊息獲取,
在這里插入圖片描述

訊息獲取

先看一下訊息獲取的原始碼在這里插入圖片描述
在這里插入圖片描述
這里面有兩點可以了解的

第一點是選擇消費實體,這里的實體實在之前 注冊本地消費者的時候 ,寫入與快取

在這里插入圖片描述

在這里插入圖片描述
快取已寫入,所以啟動的時候就可以獲取得到:

在這里插入圖片描述
第二點就是,雖然我們使用的是推的模式進行資料的獲取和消費,但是最侄訓是用拉的模式進行處理,

接下來繼續看拉取的流程
在這里插入圖片描述
在這里插入圖片描述
這邊也有兩點可以講解

第一是 拉取訊息的回呼方法
第二是拉取訊息的具體方式

但是由于拉取訊息后才會進入回呼,一些引數配也有影響,比如,defaultMQPushConsumer.getPullBatchSize(),就是拉取的數量,回呼會用到,所以先看第二種,

在這里插入圖片描述
在這里插入圖片描述
以上就是拉取訊息,那么最后再觀察下 如何處理消費 pullCallback !

PullCallback 最終是呼叫 onSuccess方法,而里面我認為最核心的是
在這里插入圖片描述
在這里插入圖片描述
訊息的處理有兩種,一種是并發,一種是順序:

并發
在這里插入圖片描述
這里有一點需要注意ps(這里是半懵半猜的,有看懂的可以提醒一下博主)

defaultMQPushConsumer.getConsumeMessageBatchMaxSize()

是判斷批量的數量大小,但是默認 是一條,網路上卻有的資料是說 32,跟進去卻沒有發現哪里有進行數值的修改,只在上一步拉取的時候有設定32的拉取數量,姑且只能猜測是這個數值在其它封裝的地方有進行默認數值的更改,

順序:

這個還是有點意思的,畢竟多個 MessageQueue 獲取訊息怎么才能順序

ConsumeRequest 中
在這里插入圖片描述
然而他是拿到一個鎖一個 ㄟ( ▔, ▔ )ㄏ,

負載均衡

在這里插入圖片描述
在這里插入圖片描述
至于負載均衡模式是哪里來的,在我們最開始創建實體的時候們就有一個默認模式的設定
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

END

怎么說呢,一把辛酸淚吧,哪個專案不是資源少時間緊,如果用一個組件還要花相當的精力去研究,除非甲方仁慈公司寬容,不然還是放棄吧,

真的要用 RocketMQ 的話,那就用商業版吧(我覺得這個開源版目的就是引導我們用商業版!!!)

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

標籤:其他

上一篇:樹莓派(raspberry pi)日記1之個人網站的構建(localhost內網穿透實作公網可以訪問)

下一篇:【內網穿透Nas】基于Frp實作群暉的遠程訪問(ssh、DSM、DS file、WebDAV Server)

標籤雲
其他(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