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

關于 RocketMQ ClientID 相同引發的消息堆積的問題

開發 前端
這篇文章講解了 RocketMQ 的 Consumer 啟動之后都做了哪些操作,對理解本次要講解的 BUG 有一定的幫助。

[[436290]]

首先,造成這個問題的 BUG RocketMQ 官方已經在 3月16號 的這個提交中修復了,這里只是探討一下在修復之前造成問題的具體細節,更多的上下文可以參考我之前寫的 《RocketMQ Consumer 啟動時都干了些啥?》 ,這篇文章講解了 RocketMQ 的 Consumer 啟動之后都做了哪些操作,對理解本次要講解的 BUG 有一定的幫助。

其中講到了:

消息堆積

重復消費自不必說,你 ClientID 都相同了。本篇著重聊聊為什么會消息堆積。

文章中講到,初始化 Consumer 時,會初始化 Rebalance 的策略。你可以大致將 Rebalance 策略理解為如何將一個 Topic 下的 m 個 MessageQueue 分配給一個 ConsumerGroup 下的 n 個 Consumer 實例的策略,看著有些繞,其實就長這樣:

rebalance策略

而從 Consumer 初始化的源碼中可以看出,默認情況下 Consumer 采取的 Rebalance 策略是 AllocateMessageQueueAverage()。

默認的 Rebalance 策略

默認的策略很好理解,將 MessageQueue 平均的分配給 Consumer。舉個例子,假設有 8 個 MessageQueue,2 個 Consumer,那么每個 Consumer 就會被分配到 4 個 MessageQueue。

那如果分配不均勻怎么辦?例如只有 7 個 MessageQueue,但是 Consumer 仍然是 2 個。此時 RocketMQ 會將多出來的部分,對已經排好序的 Consumer 再做平均分配,一個一個分發給 Consumer,直到分發完。例如剛剛說的 7 個 MessageQueue 和 2 個 ConsumerGroup 這種 case,排在第一個的 Consumer 就會被分配到 4 個 MessageQueue,而第二個會被分配到 3 個 MessageQueue。

大家可以先理解一下 AllocateMessageQueueAveragely 的實現,作為默認的 Rebalance 的策略,其實現位于這里:

默認策略的實現位置

接下來我們看看,AllocateMessageQueueAveragely 內部具體都做了哪些事情。

其核心其實就是實現的 AllocateMessageQueueStrategy 接口中的 allocate 方法。實際上,RocketMQ 對該接口總共有 5 種實現:

  • AllocateMachineRoomNearby
  • AllocateMessageQueueAveragely
  • AllocateMessageQueueAveragelyByCircle
  • AllocateMessageQueueByConfig
  • AllocateMessageQueueByMachineRoom
  • AllocateMessageQueueConsistentHash

其默認的 AllocateMessageQueueAveragely 只是其中的一種實現而已,那執行 allocate 它需要什么參數呢?

入參

需要以下四個:

  • ConsumerGroup 消費者組的名字
  • currentCID 當前消費者的 clientID
  • mqAll 當前 ConsumerGroup 所消費的 Topic 下的所有的 MessageQueue
  • cidAll 當前 ConsumerGroup 下所有消費者的 ClientID

實際上是將某個 Topic 下的所有 MessageQueue 分配給屬于同一個消費者的所有消費者實例,粒度是 By Topic 的。

所以到這里剩下的事情就很簡單了,無非就是怎么樣把這一堆 MessageQueue 分配給這一堆 Consumer。這個怎么樣,就對應了 AllocateMessageQueueStrategy 的不同實現。

接下來我們就來看看 AllocateMessageQueueAveragely 是如何對 MessageQueue 進行分配的,之前講源碼我一般都會一步一步的來,結合源碼跟圖,但是這個源碼太短了,我就直接先給出來吧。

  1. public List<MessageQueue> allocate(String consumerGroup, String currentCID, List<MessageQueue> mqAll, List<String> cidAll) { 
  2.   if (currentCID == null || currentCID.length() < 1) { 
  3.     throw new IllegalArgumentException("currentCID is empty"); 
  4.   } 
  5.   if (mqAll == null || mqAll.isEmpty()) { 
  6.     throw new IllegalArgumentException("mqAll is null or mqAll empty"); 
  7.   } 
  8.   if (cidAll == null || cidAll.isEmpty()) { 
  9.     throw new IllegalArgumentException("cidAll is null or cidAll empty"); 
  10.   } 
  11.  
  12.   List<MessageQueue> result = new ArrayList<MessageQueue>(); 
  13.  
  14.   // 判斷一下當前的客戶端是否在 cidAll 的集合當中 
  15.   if (!cidAll.contains(currentCID)) { 
  16.     log.info("[BUG] ConsumerGroup: {} The consumerId: {} not in cidAll: {}"
  17.              consumerGroup, 
  18.              currentCID, 
  19.              cidAll); 
  20.     return result; 
  21.   } 
  22.  
  23.   // 拿到當前消費者在所有的消費者實例數組中的位置 
  24.   int index = cidAll.indexOf(currentCID); 
  25.   // 用 messageQueue 的數量 對 消費者實例的數量取余數, 這個實際上就把不夠均勻分的 MessageQueue 的數量算出來了 
  26.   // 舉個例子, 12 個 MessageQueue, 有 5 個 Consumer, 12 % 5 = 2  
  27.   int mod = mqAll.size() % cidAll.size(); 
  28.   int averageSize = 
  29.     mqAll.size() <= cidAll.size() ? 1 : (mod > 0 && index < mod ? mqAll.size() / cidAll.size() + 1 : mqAll.size() / cidAll.size()); 
  30.   int startIndex = (mod > 0 && index < mod) ? index * averageSize : index * averageSize + mod; 
  31.   int range = Math.min(averageSize, mqAll.size() - startIndex); 
  32.   for (int i = 0; i < range; i++) { 
  33.     result.add(mqAll.get((startIndex + i) % mqAll.size())); 
  34.   } 
  35.   return result; 

其實前半部分都是些常規的 check,可以忽略不看,從這里:

  1. int index = cidAll.indexOf(currentCID); 

開始,才是核心邏輯。為了避免邏輯混亂,還是假設有 12 個 MessageQueue,5 個 Consumer,同時假設 index=0 。

那么 mod 的值就為 12 % 5 = 2 了。

而 averageSize 的值,稍微有點繞。如果 MessageQueue 的數量比消費者的數量還少,那么就為 1 ;否則,就走這一堆邏輯(mod > 0 && index < mod ? mqAll.size() / cidAll.size() + 1 : mqAll.size() / cidAll.size())。我們 index 是 0,而 mod 是 2,index < mod 則是成立的,那么最終 averageSize 的值就為 12 / 5 + 1 = 3。

接下來是 startIndex,由于這個三元運算符的條件是成立的,所以其值為 0 * 3 ,就為 0。

看了一大堆邏輯,是不是已經暈了?直接舉實例:

12 個 Message Queue

5 個 Consumer 實例

按照上面的分法:

排在第 1 的消費者 分到 3 個

排在第 2 的消費者 分到 3 個

排在第 3 的消費者 分到 2 個

排在第 4 的消費者 分到 2 個

排在第 5 的消費者 分到 2 個

具體分配流程

所以,你可以大致認為:

先“均分”,12 / 5 取整為 2。然后“均分”完之后還剩下 2 個,那么就從上往下,挨個再分配,這樣第 1、第 2 個消費者就會被多分到 1 個。

所以如果有 13 個 MessageQueue,5 個 Consumer,那么第 1、第 2、第 3 就會被分配 3 個。

但并不準確,因為分配的 MessageQueue 是一次性的,例如那 3 個 MessageQueue 是一次性獲取的,不會先給 2 個,再給 1 個。

而我們開篇提到的 Consumer 的 ClientID 相同,會造成什么?

當然是 index 的值相同,進而造成 mod、averageSize、startIndex、range 全部相同。那么最后 result.add(mqAll.get((startIndex + i) % mqAll.size())); 時,本來不同的 Consumer,會取到相同的 MessageQueue(舉個例子,Consumer 1 和 Consumer 2 都取到了前 3 個 MessageQueue),從而造成有些 MessageQueue(如果有的話) 沒有 Consumer 對其消費,而沒有被消費,消息也在不停的投遞進來,就會造成消息的大量堆積。

當然,現在的新版本從代碼上看已經修復這個問題了,這個只是對之前的版本的原因做一個探索。

 

責任編輯:姜華 來源: SH的全棧筆記
相關推薦

2023-12-21 08:01:41

RocketMQ消息堆積

2022-11-08 07:36:17

RocketMQ消費者消息堆積

2021-11-08 15:38:15

消息延遲堆積

2021-10-26 08:22:38

消息堆積擴容RocketMQ

2024-07-29 00:01:00

RabbitMQ消息堆積

2024-06-24 08:42:11

2021-10-03 21:41:13

RocketMQKafkaPulsar

2013-06-20 09:59:12

Javascriptvar

2013-08-08 10:20:04

云計算災難恢復反思

2024-10-29 08:34:27

RocketMQ消息類型事務消息

2024-11-11 13:28:11

RocketMQ消息類型FIFO

2021-02-02 11:01:31

RocketMQ消息分布式

2021-07-08 07:16:24

RocketMQ數據結構Message

2010-09-29 15:55:22

DHCP IP相同

2022-12-22 10:03:18

消息集成

2024-12-09 08:44:58

2024-06-06 11:57:44

2021-07-07 15:29:52

存儲RocketMQ體系

2023-01-10 08:20:55

RocketMQ消息源碼

2021-07-14 17:18:14

RocketMQ消息分布式
點贊
收藏

51CTO技術棧公眾號

欧美1区二区| 亚洲一区二区三区午夜| 99视频在线免费播放| 中文字幕永久在线| 成人直播在线观看| 亚洲免费视频成人| 国产精品日本精品| 国产高清av在线播放| 97人妻精品一区二区三区软件 | 欧美日韩国产中文字幕 | 久久久久高清精品| 国内精品模特av私拍在线观看| 一区二区三区 日韩| 青青草视频免费在线观看| 老司机亚洲精品一区二区| 国产欧美视频在线观看| 欧美在线视频免费观看| 国产一级二级视频| 欧美野外wwwxxx| 国产精品 日产精品 欧美精品| 色婷婷av一区二区三区久久| 成人免费毛片播放| 免费在线视频一级不卡| 香蕉成人久久| 国产网站欧美日韩免费精品在线观看| 老太脱裤让老头玩ⅹxxxx| 国产69精品久久app免费版| 爽好久久久欧美精品| 亚洲人成免费电影| 爆乳熟妇一区二区三区霸乳| 美女精品视频| 亚洲欧洲日产国码二区| 成人亲热视频网站| 我家有个日本女人| 91在线一区| 欧美精品 国产精品| 2025韩国大尺度电影| 99久久精品日本一区二区免费| 婷婷久久综合| 日韩三级av在线播放| 国产欧美精品aaaaaa片| 好吊色一区二区三区| 一本色道88久久加勒比精品| 亚洲欧美在线第一页| 91精品国产高清91久久久久久| 丁香花在线观看完整版电影| 91亚洲精品一区二区乱码| 日本一区二区在线免费播放| 色婷婷国产精品免| 久久久久久久久久久久电影| 欧美天堂一区二区三区| 干日本少妇视频| 秋霞av鲁丝片一区二区| 乱码第一页成人| 中文字幕在线亚洲| 少妇极品熟妇人妻无码| 成人免费91| 午夜伦理一区二区| 日韩在线导航| 国内老熟妇对白xxxxhd| 久久国产精品久久w女人spa| 69视频在线免费观看| 欧美激情久久久久久久| 国产伦精品一区二区三区千人斩| 欧美理论电影在线| 日韩一区二区三区久久| ****av在线网毛片| 国产日韩精品久久久| 5g国产欧美日韩视频| 欧美亚洲精品天堂| 欧美jjzz| 尤物99国产成人精品视频| 久久久久中文字幕亚洲精品| 中文字幕av一区二区三区四区| 欧美午夜影院一区| 永久免费的av网站| 久久99成人| 精品国产区一区| 中文字幕成人在线视频| 欧美91在线|欧美| 精品福利樱桃av导航| 中文字幕一区二区三区在线乱码 | 国产精品久久久久久久精| 欧美久色视频| 国产亚洲精品一区二555| 日韩精品在线播放视频| 99久久综合国产精品二区| 亚洲国产精品久久久男人的天堂 | av网站在线免费观看| 成人av在线观| 亚洲精品免费一区二区三区| 午夜精品一区二| 在线日韩中文| 欧美成人免费全部| 国产在线观看免费视频软件| 亚洲精品456| 日韩片之四级片| 91精品国产自产| 美女午夜精品| 精品国产制服丝袜高跟| 拔插拔插华人永久免费| 影视一区二区三区| 色综合久久久久久久久| 欧美大片在线播放| av成人免费看| 精品处破学生在线二十三| 法国空姐电影在线观看| 老牛影视av一区二区在线观看| 亚洲亚裔videos黑人hd| 免费又黄又爽又色的视频| 亚洲国产精品日韩专区av有中文| 日韩在线国产精品| 国产一级中文字幕| 韩国久久久久| 久久久天堂国产精品女人| 无码人妻丰满熟妇区五十路| 国产福利一区在线观看| 欧美一级爽aaaaa大片| 国产在线你懂得| 国产欧美日韩另类一区| 国产又粗又长又爽视频| 日本乱理伦在线| 亚洲高清一区二区三区| 污片在线免费看| 一本色道久久综合亚洲精品酒店 | 性爽视频在线| 黑人巨大精品欧美一区二区| 91欧美一区二区三区| 涩涩屋成人免费视频软件| 日韩欧美国产系列| 国模无码视频一区| 亚洲宅男网av| 欧美激情一区二区三级高清视频| 精品少妇theporn| 国产一区导航| 国产精品日韩电影| 欧美成人片在线| 香蕉av福利精品导航| 亚洲区 欧美区| 国产一区二区三区亚洲| 亚洲欧美国产日韩天堂区| 国产精品久久免费观看| 男人的天堂亚洲在线| 精品国产一区二区三区麻豆小说 | 激情网站五月天| 影音成人av| 777午夜精品视频在线播放| 日本美女久久久| 久久久9色精品国产一区二区三区| 国产精品7m视频| 国产日韩欧美中文字幕| 亚洲色图一区二区三区| 国产一级爱c视频| 99国产精品久久一区二区三区| 欧美精品情趣视频| www.国产精品视频| 久久综合视频网| 99久久久无码国产精品性色戒| 激情亚洲小说| 日韩一级裸体免费视频| 免费观看一级视频| 成人h动漫精品一区二区| 国产精品www在线观看| 自拍偷自拍亚洲精品被多人伦好爽 | www.xxxx精品| 国产日韩欧美视频在线观看| 一区二区三区中文字幕| 亚洲欧洲日产国码无码久久99| 欧美黄页在线免费观看| 播播国产欧美激情| www夜片内射视频日韩精品成人| 夜夜嗨av一区二区三区网页| 男女啪啪网站视频| 成人av动漫| 97国产精品视频人人做人人爱| 一级黄色片在线播放| 99久久国产综合精品麻豆| 97成人在线免费视频| 精品123区| 日韩中文字幕视频在线观看| 99精品人妻无码专区在线视频区| 亚洲成a人片在线不卡一二三区| 四虎永久免费影院| 中文一区一区三区免费在线观看| 国产91色在线|| 在线免费黄色| 欧美成人性战久久| 久久久黄色大片| 成人国产精品视频| 丁香婷婷激情网| 一个色综合网| 欧美二区三区在线| 蜜桃视频在线观看播放| 日韩精品一区二区三区视频| 天堂网一区二区三区| 国产91精品精华液一区二区三区 | 美女黄网久久| 中文字幕免费高| 天堂99x99es久久精品免费| 欧美国产日韩在线| 国产喷水福利在线视频| 欧美日韩激情小视频| 亚洲黄色免费视频| 欧美一级播放| 特级黄色录像片| 自拍自偷一区二区三区| 亚洲直播在线一区| 国精产品一区二区三区有限公司| 久久91精品国产91久久跳| 国产精品免费无遮挡| 精品毛片三在线观看| 潘金莲一级黄色片| 久久先锋影音av| 中国特级黄色片| 免费精品视频在线| 亚洲一卡二卡区| 欧美理伦片在线播放| 亚洲free嫩bbb| 成人h在线观看| 69影院欧美专区视频| 最新黄网在线观看| 日韩精品一区二区三区视频在线观看| 波多野结衣大片| 婷婷国产v国产偷v亚洲高清| 99久久久免费精品| 国产欧美精品一区二区色综合| 在线免费看黄色片| 国产成人综合亚洲网站| 福利片一区二区三区| 欧美在线日韩| 国产奶头好大揉着好爽视频| 日韩精品影视| 亚洲一区二区三区xxx视频| 暖暖成人免费视频| 中文字幕在线成人| 欧美日韩国产中文字幕在线| 亚洲福利在线播放| 中文字幕日韩免费| 欧美性猛交xxxx免费看| 亚洲一二三四视频| 国产日产欧美一区二区视频| 老司机福利av| 91免费在线视频观看| 最新国产黄色网址| 蜜臀av一区二区在线免费观看| 少妇高清精品毛片在线视频| 亚洲欧美视频| 无遮挡又爽又刺激的视频| 性感少妇一区| caoporn超碰97| 日本欧美在线看| 成人小视频在线观看免费| 羞羞答答成人影院www| 免费观看中文字幕| 欧美一区二区三区另类| 大地资源网在线观看免费官网| 欧美一区视频| www.av91| 亚洲影音一区| 亚洲第一狼人区| 国产一区二区三区不卡在线观看| 免费av手机在线观看| 中文日韩欧美| 粗暴91大变态调教| 麻豆国产91在线播放| 国产乱子伦农村叉叉叉| 亚洲永久字幕| 国产视频手机在线播放| 精品一区精品二区高清| 亚洲成熟丰满熟妇高潮xxxxx| 久久精品电影| 国产美女18xxxx免费视频| 国产精品一区在线| 亚洲欧美在线精品| 国产一区二区在线视频| 国产精九九网站漫画| 国产真实乱对白精彩久久| 日韩视频在线观看一区二区三区| 国产成人精品综合在线观看| 噜噜噜在线视频| 国产精品国产三级国产普通话蜜臀 | 国产一级精品毛片| 欧美日韩一区二区在线 | 福利在线导航136| 国产91成人在在线播放| 欧美理论电影| 国产成人精品免高潮费视频| 91精品国产一区二区在线观看| 国产精品99导航| 国产午夜久久av| 欧美日本韩国国产| 天天影视欧美综合在线观看| 欧美深夜福利视频| 久久精品理论片| 尤物网站在线观看| 国产99精品国产| 国产 欧美 在线| 9久草视频在线视频精品| 国产成人av片| 久久精品视频一区| 免费网站观看www在线观| 欧美综合在线视频| 中文天堂在线播放| 欧美视频一区二区三区四区| 亚洲成人一级片| 精品99一区二区三区| 国产精品麻豆一区二区三区| 久久久国产视频91| av在线free| 九色91av视频| 巨胸喷奶水www久久久免费动漫| 国产精品精品软件视频| 粉嫩av一区二区| 咪咪色在线视频| 石原莉奈一区二区三区在线观看| 2018国产精品| 亚洲欧洲精品一区二区精品久久久| 中国一级特黄毛片| 欧美成人bangbros| 黄色免费网站在线| 欧美风情在线观看| 日韩av黄色| 91视频99| 91嫩草亚洲精品| 欧美日韩中文字幕在线播放| 狠狠综合久久| 中文字幕第10页| 中文字幕一区三区| 国产乱码在线观看| 一区三区二区视频| 欧美××××黑人××性爽| 久久伊人一区| 日韩欧美高清| av无码精品一区二区三区| 久久亚洲一区二区三区四区| 91精品国产乱码在线观看| 精品久久久久久久人人人人传媒 | 51国偷自产一区二区三区的来源| 日韩国产一区二区| 无需播放器的av| 国产精品久久久久影院亚瑟| 免费国产羞羞网站美图| 亚洲国产精品欧美一二99| www.com欧美| 欧美国产日韩中文字幕在线| 婷婷视频一区二区三区| 996这里只有精品| 国产成人精品免费网站| 九九热视频精品| 亚洲成av人乱码色午夜| 成人爽a毛片免费啪啪动漫| 国产精品久久久久久久久久久久午夜片| 欧美日韩1区| 视频免费在线观看| 偷拍与自拍一区| 国产私人尤物无码不卡| 国产欧美亚洲视频| 欧美亚视频在线中文字幕免费| 三上悠亚久久精品| 久久久综合网站| 中文字幕码精品视频网站| 久久精品福利视频| 日韩视频1区| 欧美精品一区二区三区三州| 99久久国产综合精品色伊| 欧美日韩a v| 日韩一区二区三区国产| 日韩精品三级| 自慰无码一区二区三区| 国产精品无圣光一区二区| 中文字幕在线观看免费视频| 精品一区二区三区四区| 日韩精品第一| 青青在线视频免费观看| 99在线精品观看| 中文字幕 人妻熟女| 久热爱精品视频线路一| 午夜精品成人av| 亚洲乱码一区二区三区三上悠亚 | 国内外成人免费激情在线视频网站 | 国产婷婷色综合av蜜臀av| 福利一区在线| 国产日韩亚洲欧美在线| 久久久蜜桃精品| 国产麻豆一精品一男同| 7777精品视频| 国产精品久久久久久麻豆一区软件| 国产乱淫av麻豆国产免费| 一本到不卡免费一区二区| 黄网页免费在线观看| 久久久久高清| 亚洲黄色影院| 极品蜜桃臀肥臀-x88av| 精品少妇一区二区三区在线播放| 国产精品av一区二区三区| 精品久久久久久中文字幕动漫| 日韩av一区二区三区| 成人免费看片98| www.色综合| 精品一区免费|