精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從RocketMQ的Broker源碼層面驗證一下這兩個點

開發 前端
Producer從啟動到發送消息的整個過程,從源碼級別分析了Producer在發送消息到Broker的時候,是如何拿到Broker的數據的,如何從多個MessageQueue中選擇對應的Queue發送消息。

 [[387560]]

本篇博客會從源碼層面,驗證在RocketMQ基礎概念剖析,并分析一下Producer的底層源碼中提到的結論,分別是:

  • Broker在啟動時,會將自己注冊到所有的NameServer上
  • Broker在啟動之后,會每隔30S向NameServer發送心跳

之前的文章中,我們知道了RocketMQ中的一些核心概念,例如Broker、NameServer、Topic和Tag等等。Producer從啟動到發送消息的整個過程,從源碼級別分析了Producer在發送消息到Broker的時候,是如何拿到Broker的數據的,如何從多個MessageQueue中選擇對應的Queue發送消息。

但是由于篇幅原因,文章開頭提到的兩個已知結論在上篇博客里并沒沒有對其進行驗證,這次就從源碼層面來驗證一下。

一開頭就看到Broker主從架構相關的源碼

在上篇博客中提到過,Broker為了保證自身的高可用,會采取一主一從的架構。即使Master Broker因為意外原因掛了,Slave Broker上還有一份完整的數據,Broker可以繼續提供服務。

isEnableDLegerCommitLog中提到的DLeger可以先不管,我們目前只需要知道其默認返回的結果是false。所以Broker首次啟動的時候,就會執行被If包裹住的邏輯。

RocketMQ本身是有主從架構的,但是功能不夠完善,如果Master Broker出現了故障,需要人工的將Slave Broker切換成Master。

就有點類似于手動的將一臺Redis設置成另一臺Redis的Slave節點,如果此時Redis的Master掛了,還需要手動的進行切換一樣。為了解決這個問題,Redis搞出了Sentinel,可以在發生故障的時候自動的實現故障轉移。所以RocketMQ在4.5版本之后推出的Dleger差不多也是這么個東西,除此之外,Dleger還可以實現多副本。

不使用Dleger時,主從數據如何進行同步

先給出結論,在RocketMQ的主從架構下,主從同步采取的是Slave主動拉取的方式。

如果當前執行注冊的Broker角色是Slave,那就會使用ScheduledExecutorService啟動一個周期性的定時任務,每隔10秒就會去Master同步一次,同步的數據包括Topic的相關配置、Consumer的消費偏移量、延遲消息的Offset、訂閱組的相關數據和配置。

ScheduledExecutorService的作用和原理下面會做簡單介紹。

首次啟動時強制進行Broker注冊

因為是首次啟動,所以參數forceRegister被直接設置成了true。

使用ScheduledExecutorService啟動定時任務

通過入口進來之后,Broker會啟動一個定時任務,周期性的去注冊。ScheduledExecutorService底層就是一個newSingleThreadScheduledExecutor,只有一個線程的線程池,其關鍵的參數corePoolSize值為1,然后按照指定的頻率周期性的執行某個任務。

ScheduledExecutorService主要的功能有兩個,分別是:

  • ScheduledExecutorService 以固定的頻率執行任務
  • ScheduledExecutorService 執行完之后,間隔制定的時間后再執行下一個任務

使用scheduleAtFixedRate實現心跳機制

此處我們使用的是scheduleAtFixedRate,如下圖。

至于執行的頻率,我們能夠配置的范圍最大不能超過一分鐘,也就是說這個范圍是在10-60秒之間,默認30秒執行一次,這也就驗證了每30秒,Broker會向NameServer發送一次心跳。

獲取執行頻率的這個判斷有點意思,甚至看起來有那么一絲絲簡潔,但是理解其具體可配置的時間范圍可能需要花點時間。在實際業務性代碼中,個人建議還是不要這么寫,業務中代碼的可讀性和可維護性我認為是需要放在首位的。

值得注意的是,此處啟動心跳,給了一個10秒的延遲,因為在不使用Dleger的情況下,在之前的邏輯中已經執行過一次注冊了。如果不做延遲,那么幾乎是同一個時間就會有兩次注冊操作,而這明顯是不符合預期的;同時forceRegister也從true變成了通過函數isForceRegister來進行獲取。

調用registerBrokerAll注冊

定時任務注冊完成之后,之后的每次觸發都會執行registerBrokerAll方法來執行注冊,你可能會有疑問,我當前不就是一個Broker嗎,怎么名字有個后綴All?那是因為NameServer會有多個,Broker啟動的時候會將自己注冊到所有的NameServer上去。當然,口說無憑,我們繼續看下去。

繼續往里走,如果當前滿足注冊條件,則會實際的執行注冊操作。那具體滿足什么條件呢?由變量forceRegister和一個needRegister方法來決定,forceRegister默認是true,所以當第一執行這個邏輯的時候是一定會執行注冊操作的。

通過對比數據版本判斷當前Broker是否需要進行注冊

感興趣的話,可以繼續跟隨文章了解一下,needRegister是根據什么來判斷是否需要注冊的。

首先,Broker一旦注冊到了NameServer之后,由于Producer不停的在寫入數據,Consumer也在不停的消費數據,Broker也可能因為故障導致MessageQueue等關鍵路由信息發生變動,NameServer中的數據和Broker中實際的數據就會不一致,如果不及時更新,Producer拉取到的路由數據就可能有誤。

所以每次定時任務觸發的時候會去對比NameServer和Broker的數據,如果發現數據版本不一致,Broker會重新進行注冊,將最新的數據更新到NameServer。說直白一點,就是做一個數據定時更新。以下紅框中的代碼就是數據對比的核心代碼。

當Broker和所有的NameServer節點一一完成數據對比之后,就會進行結果判定,但凡有一個節點數據不一致,都需要進行重新注冊,把最新的數據更新到NameServer,核心判斷邏輯同樣用紅框標出。

至此,其實我們就已經完成了 Broker在啟動的時候會向所有NameServer進行注冊 的驗證。但是由于后續仍然有值得關注發光點,我們繼續后續的源碼閱讀。

使用CountDownLatch獲取所有注冊異步任務的返回結果

除此之外,還值得注意的是在needRegister中,對于和多個NameServer的交互,RocketMQ是通過線程池異步實現的,同時使用了CountDownLatch來等待所有的請求結束,返回結果給主線程。

既然聊到了CountDownLatch,就順帶提一下。假設我們有5個互不依賴的計算任務,如果快速的計算出結果并返回呢?那當然是5個任務并發執行,這就需要通過新開線程實現,結果就無法一起返回了。

而CountDownLatch可以讓主線程等待,等待這5個計算任務全部結束之后,喚醒主線程再繼續后面的邏輯。這就是CountDownLatch的作用,如果平時只是單純的CRUD功能的話,可能連CountDownLatch是什么都做不知道,這也是為什么大廠面試會問這些問題,因為在大廠的復雜業務背景下,你必須要會使用它們。

指定需要注冊之后,接下來就是核心的注冊方法了,核心邏輯由registerBrokerAll來實現。Broker同樣會去每一個NameServer節點上注冊自己,并且為了提前執行的效率,同樣開線程采用了異步的方式。在獲取所有結果時,同樣的使用了CountDownLatch。

使用CopyOnWriteArrayList存儲注冊請求的返回

除此之外,用于保存注冊結果的列表,使用的是CopyOnWriteArrayList,被面試虐過的同學應該熟悉。我們知道此處開啟了多線程去不同的NameServer注冊,寫入注冊結果的時候,多線程對同一個列表進行寫入,會產生線程安全的問題。

而我們知道ArrayList是非線程安全的,這也是為什么此處要使用CopyOnWriteArrayList來保存注冊結果。為什么CopyOnWriteArrayList能夠保證線程安全?

這歸功于COW(Copy On Write),讀請求時共用同一個List,涉及到寫請求時,會復制出一個List,并在寫入數據的時候加入獨占鎖。比起直接對所有操作加鎖,讀寫鎖的形式分離了讀、寫請求,使其互不影響,只對寫請求加鎖,降低了加鎖的消耗,提升了整體操作的并發。

上面并發執行的注冊操作,具體做了哪些事情呢?先看代碼。

上面就是單個注冊的所有邏輯,可以看到在構建完請求之后,有一個oneway的判斷。

oneway值為false,表示單向通信,Broker不關心NameServer的返回,也不會觸發任何回調函數。接下來Broker就會把已經寫進request body的所有數據發送給NameServer。請求數據統一由一個叫TopicConfigSerializeWrapper的Wrapper給包裹住。

其可以看為兩部分:

  • 存在該Broker節點上的所有Topic的數據
  • 數據版本

然后帶著這些數據,Broker會同步的調用invokeSync發送請求給NameServe,并且在執行之后觸發實現特定功能的回調函數。

EOF

至此,我們完成了對開篇所提結論的驗證,同時也發現了RocketMQ的主從架構、Master和Slave同步數據的方式、心跳機制的實現等等,也基本從源碼中看完了Broker啟動的所有流程。看這些老哥寫的源碼還是挺有意思的,之后有時間隨緣再看看NameServer端相關的源碼吧。

 

責任編輯:武曉燕 來源: SH的全棧筆記
相關推薦

2024-09-26 00:22:24

2018-08-17 08:56:03

WindowsLinux系統

2020-12-10 10:32:33

區塊鏈比特幣數字貨幣

2021-02-26 13:59:41

RocketMQProducer底層

2022-05-02 16:18:22

RocketMQBrokertopic

2022-02-21 23:08:50

Kubernetes集群容器

2023-01-13 16:57:50

SpringBoot配置核心

2022-06-23 08:01:48

hookSetMap

2021-12-02 07:50:30

字節緩沖流使用

2020-02-27 14:05:26

SQLServer數據庫

2021-05-11 16:44:42

Windows工具軟件

2016-10-25 13:58:36

數據圖表化大數據

2020-12-09 09:39:52

SaaSLTV軟件

2025-03-12 00:22:00

2017-08-28 14:47:54

NASSAN存儲

2018-03-21 12:13:47

工具數據開發

2021-04-15 09:07:52

hotspotJavaC++

2017-01-13 09:07:48

大數據互聯網數據挖掘

2022-04-22 13:04:43

微軟Windows 10

2024-07-29 09:30:23

點贊
收藏

51CTO技術棧公眾號

小说区图片区亚洲| 一本一道波多野毛片中文在线| 影音先锋亚洲电影| 日韩精品欧美国产精品忘忧草| 日本999视频| 久久五月精品| 91看片淫黄大片一级| 国产精品欧美激情| 国产福利久久久| 国产亚洲一卡2卡3卡4卡新区 | 亚洲美女15p| 9191久久久久久久久久久| 国产真人做爰毛片视频直播| 国产三级在线观看| 国产91丝袜在线18| 国产欧美日韩中文字幕在线| 欧美三根一起进三p| 怕怕欧美视频免费大全| 日韩免费视频线观看| 天天爱天天操天天干| av岛国在线| 18欧美亚洲精品| 快播日韩欧美| 精品国产av鲁一鲁一区| 日本91福利区| 欧美一级在线亚洲天堂| 久久久久久久久久久久久久久久久 | 美女久久一区| 国内精久久久久久久久久人| 手机在线中文字幕| 国产调教一区二区三区| 日韩av网站大全| 少妇丰满尤物大尺度写真| 国产91精品在线| 一本大道av一区二区在线播放| 精品一二三四五区| 在线免费av网站| 久久久久亚洲综合| 精品无人乱码一区二区三区的优势 | 国产一区二区久久久| a毛片在线免费观看| 久久电影国产免费久久电影| 国产精品96久久久久久| 欧美性猛交bbbbb精品| 亚洲国产国产亚洲一二三| 九九热精品视频国产| 欧美在线视频第一页| 91九色精品国产一区二区| 神马久久久久久| www.涩涩爱| 精品国产一区二区三区噜噜噜| 亚洲欧美日韩另类| 国产亚洲精品熟女国产成人| 久草成人资源| 夜夜嗨av一区二区三区免费区| 少妇精品一区二区三区| 色先锋久久影院av| 亚洲免费电影一区| 国产中年熟女高潮大集合| 亚洲人挤奶视频| 亚洲欧美日韩国产中文| 成人在线手机视频| 欧美va久久久噜噜噜久久| 日韩在线资源网| 欧美黑人性猛交xxx| 欧美三区美女| 97香蕉久久夜色精品国产| 99热只有这里有精品| 香蕉精品999视频一区二区 | 国产精品亚洲综合在线观看| 91精品在线麻豆| 激情av中文字幕| 欧洲在线一区| 国产亚洲精品一区二区| 网站永久看片免费| 欧美激情综合| 欧美一乱一性一交一视频| 欧美brazzers| 国产一区二区三区香蕉| 动漫一区二区在线| 日本v片在线免费观看| 欧美激情资源网| 欧美性受黑人性爽| 韩国精品一区| 欧美手机在线视频| 激情小说欧美色图| 美女亚洲一区| 不卡av电影院| 日韩精品久久久久久免费| 麻豆91精品视频| 国产一区二区视频在线免费观看| 国产尤物视频在线| 一区二区三区视频在线观看| 免费成人在线视频网站| 青青草国产一区二区三区| 欧美精品一区二区三区一线天视频| 亚洲午夜久久久久久久久红桃| 91影院成人| 久久久久久久久网站| 97人妻精品视频一区| 粉嫩久久99精品久久久久久夜| 欧美1o一11sex性hdhd| 国产在线观看a| 色综合网色综合| 欧美性猛交xx| 精品免费在线| 88国产精品欧美一区二区三区| 国产一区二区三区黄片| 91视频国产观看| 欧美日韩激情四射| 国产香蕉久久| 亚洲乱码国产乱码精品精天堂 | 五月开心婷婷久久| www.cao超碰| 国产精品视频一区二区三区四蜜臂| 美女av一区二区| 中文字幕一二三四| 91小视频免费看| 亚洲乱码日产精品bd在线观看| 91亚洲精品| 日韩精品在线看| 欧美一级高潮片| 国产在线麻豆精品观看| 亚洲 日韩 国产第一区| 亚洲第一av| 亚洲成人网在线观看| 久久黄色免费网站| 国产老女人精品毛片久久| 四虎影院一区二区三区 | 国模吧视频一区| 亚洲www视频| 人人干在线视频| 欧美性videosxxxxx| 中文字幕被公侵犯的漂亮人妻| 在线观看日韩av电影| 99理论电影网| 欧美xxxx黑人又粗又长| 在线播放/欧美激情| 波多野结衣欲乱| 毛片基地黄久久久久久天堂| 欧美亚洲另类久久综合| 日韩av大片站长工具| 精品视频一区在线视频| www成人在线| 9人人澡人人爽人人精品| av高清在线免费观看| 大陆精大陆国产国语精品| 欧美大片在线看| 性一交一乱一乱一视频| 亚洲黄色片在线观看| 日本黄色大片在线观看| 黄色精品一区| 国产精品一区二区三区在线| av不卡高清| 亚洲黄页视频免费观看| www.国产色| 国产亚洲成aⅴ人片在线观看 | 日本高清不卡一区二区三区视频 | 国产午夜精品理论片在线| 麻豆国产一区二区| 色乱码一区二区三区熟女| 国产精品成人**免费视频| 久久成人av网站| 亚洲国产中文字幕在线| 午夜精品一区二区三区免费视频 | 狠狠躁18三区二区一区| 精品成人av一区二区三区| 日韩和欧美一区二区三区| 午夜欧美性电影| 欧美专区视频| 69av成年福利视频| 国产视频二区在线观看| 欧美绝品在线观看成人午夜影视| 午夜精品一区二区三区视频| 成人免费视频一区| 黑鬼大战白妞高潮喷白浆| 久久一区二区三区喷水| y111111国产精品久久婷婷| 久草在线资源福利站| 在线播放精品一区二区三区| 国产特级aaaaaa大片| 精品magnet| av中文字幕免费观看| 精品一区二区三区视频| xxxx18hd亚洲hd捆绑| 一区二区美女| 亚洲伊人一本大道中文字幕| 国产免费拔擦拔擦8x高清在线人 | 美女av在线免费看| 中文字幕日韩在线视频| 亚洲精品综合网| 在线观看网站黄不卡| 欧美人与禽zozzo禽性配| 久久亚洲一级片| 午夜xxxxx| 亚洲每日更新| 中文字幕人成一区| 三级小说欧洲区亚洲区| 91麻豆桃色免费看| 色戒汤唯在线| 欧美成在线观看| av在线播放网站| 亚洲成年人在线| 一级黄色片在线| 欧美午夜视频在线观看| 欧美日韩在线观看成人| 国产无遮挡一区二区三区毛片日本| 亚洲精品久久久久久| 青青草一区二区三区| 国产免费黄色一级片| 婷婷中文字幕一区| 欧美一级二级三级| 国产精品乱战久久久| 亚洲一区二区免费| 国产成人久久精品麻豆二区| 欧美亚洲另类制服自拍| 黄色在线看片| 久久99久久久久久久噜噜| www.亚洲资源| 亚洲嫩模很污视频| 欧美视频久久久| 日韩欧美一区在线| 国产精品久久777777换脸| 色婷婷综合久色| 亚洲男人第一av| 性欧美大战久久久久久久久| 放荡的美妇在线播放| 国产精品久线在线观看| 亚洲精品国产精品国自产网站| 99久久精品一区| 久久久无码人妻精品无码| 国产一区二区三区在线观看免费| 欧美成人乱码一二三四区免费| 三级亚洲高清视频| 日日碰狠狠添天天爽超碰97| 亚洲国产清纯| 久久久久久免费看| 激情视频一区二区三区| 欧美大黑帍在线播放| 欧美日韩99| 久久久99精品视频| 午夜国产精品视频| 日韩人妻一区二区三区蜜桃视频| 亚洲成人精品| 超碰97在线看| 欧美色一级片| 丰满少妇大力进入| 亚洲精品视频啊美女在线直播| 久久久亚洲国产精品| 伊人影院久久| 国产精品97在线| 性8sex亚洲区入口| 国产成人精品视频ⅴa片软件竹菊| 国产乱码精品| 热久久精品免费视频| 免费在线看成人av| 日韩成人精品视频在线观看| 国产精品原创巨作av| 亚洲911精品成人18网站| 国产成人精品亚洲午夜麻豆| 在线看黄色的网站| 99久久国产综合精品麻豆| 波多野结衣av在线免费观看| 久久久久久久电影| 亚洲精品自拍视频在线观看| 亚洲同性gay激情无套| 久久久久久久久久久久国产| 狠狠躁18三区二区一区| 中国一级片黄色一级片黄| 欧美一二三区在线观看| 少妇精品视频一区二区| 亚洲色无码播放| 欧洲不卡av| 欧美激情中文网| 无遮挡在线观看| 国产乱肥老妇国产一区二| 精品国产一区二| 精品欧美一区二区在线观看视频 | 国产精品香蕉| 日本精品一区二区三区视频 | 欧美黑人性视频| 欧美日韩国产v| 91免费观看网站| 欧美91在线| 中文字幕免费高| 日韩亚洲在线| www.污污视频| 91免费在线视频观看| 精品自拍偷拍视频| 色综合天天综合网天天看片| 国产人妻精品一区二区三区| 亚洲国产精品99久久| 在线观看av黄网站永久| 国内精品一区二区三区| 久久人人视频| 久久艳妇乳肉豪妇荡乳av| 性欧美69xoxoxoxo| 狠狠爱免费视频| 国产精品99久久久久久久女警| 自拍偷拍视频亚洲| 亚洲一区二区中文在线| 在线观看国产小视频| 亚洲激情成人网| √天堂8在线网| 国产精品自拍网| 欧美激情在线精品一区二区三区| 黄色a级片免费看| 久久99精品久久久久婷婷| 新91视频在线观看| 亚洲福利国产精品| 国产女人高潮时对白| 亚洲人免费视频| 免费v片在线观看| wwwxx欧美| 中文字幕日韩欧美精品高清在线| av动漫免费看| av动漫一区二区| 69av.com| 日韩一区国产二区欧美三区| 在线激情免费视频| 91成人国产在线观看| 91综合久久爱com| 国产麻豆电影在线观看| 蜜桃一区二区三区在线观看| 熟女俱乐部一区二区视频在线| 香蕉久久一区二区不卡无毒影院| 精品国产av一区二区| 久久精品视频亚洲| 日本黄色成人| 亚洲图片小说在线| 日韩高清在线一区| 欧美黑人欧美精品刺激| 五月婷婷久久丁香| 你懂的网站在线| 午夜美女久久久久爽久久| 成人知道污网站| 国产亚洲黄色片| 丁香啪啪综合成人亚洲小说| chinese全程对白| 4438x成人网最大色成网站| 日韩成人影视| 成人午夜一级二级三级| 中文视频一区| 日本人妻一区二区三区| 亚洲午夜激情av| 日韩性xxxx| 欧美一级大片在线观看| 亚洲va久久| 亚洲视频在线观看一区二区三区| 国产亚洲精品资源在线26u| 波多野结衣影片| 最新国产精品拍自在线播放 | 黄色在线免费观看网站| 精品免费二区三区三区高中清不卡| 99riav1国产精品视频| 狠狠人妻久久久久久综合蜜桃| 欧美色xxxx| 国产三级在线免费| 91久久久亚洲精品| 国内精品久久久久久久97牛牛| 中文字幕精品视频在线| 色综合婷婷久久| 免费在线看黄| eeuss一区二区三区| av不卡在线看| 精品人妻中文无码av在线| 欧美日韩中文字幕一区| 成人影院在线看| 国产一区免费视频| 日韩高清不卡在线| 在线观看黄网址| 精品999久久久| 欧美黑人巨大xxxxx| 中文字幕日韩一区二区三区不卡| 成人福利一区| 欧美日韩国产二区| 中文在线不卡视频| 日韩伦理一区二区| 成人一级生活片| 26uuu亚洲综合色| 中文字幕一级片| 久久久久久久97| 精品国产1区| 中文字幕 欧美 日韩| 欧美日韩亚洲91| 第九色区av在线| 99c视频在线| 秋霞午夜鲁丝一区二区老狼| 一区二区视频免费看| 日韩精品免费综合视频在线播放 | 色婷婷综合久色| 宅男在线观看免费高清网站| 久久涩涩网站| 国产另类ts人妖一区二区| 老熟妇仑乱一区二区av| 久久在线视频在线| 久久99久久人婷婷精品综合| 色黄视频免费看| 91福利资源站| av影院在线|