精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲高清av在线| 欧美成熟毛茸茸| 毛片av在线| 亚洲成人资源| 久久精品夜色噜噜亚洲a∨| 久久精品国产久精国产思思| 隔壁人妻偷人bd中字| 喷水视频在线观看| 秋霞午夜在线观看| 国产精品亚洲视频| 最近2019中文免费高清视频观看www99 | 久久最新视频| 精品久久人人做人人爱| 亚洲一区二区自拍偷拍| www.国产色| 亚洲精品一区二区三区中文字幕 | 91精品国产综合久久精品图片| 久久精品女人的天堂av| 粉嫩av性色av蜜臀av网站| 不卡福利视频| 粉嫩aⅴ一区二区三区四区五区| 国产亚洲视频在线| 欧美a在线视频| 亚洲精品无码久久久| 国产精品精品| 欧美日韩国产一区二区三区地区| 欧美人与性禽动交精品| 免费网站看av| 亚洲精品一区二区三区在线| 欧美系列日韩一区| 日本一区二区三区四区高清视频| 欧美bbbbbbbbbbbb精品| 亚洲视频在线免费| 欧美一卡二卡在线观看| 久久精品网站视频| 免费人成在线观看网站| 国产福利一区二区三区在线视频| xxav国产精品美女主播| 亚洲高清av一区二区三区| 免费在线午夜视频| 久久久久久久久岛国免费| 国产亚洲精品自在久久| 久久国产视频精品| 国产精品探花在线观看| 欧美在线免费视屏| 日韩第一页在线观看| 国产精品久久久久久久免费| 久久裸体网站| 欧美一级高清片在线观看| 久久99久久99精品| 羞羞视频在线免费国产| 成人爽a毛片一区二区免费| 午夜精品久久久久久久99热| 欧美深性狂猛ⅹxxx深喉| 91精品xxx在线观看| 欧美国产精品一区二区| 国产欧美精品xxxx另类| 91在线播放观看| 天天做天天爱天天爽综合网| 日韩在线高清视频| 精品视频第一页| 日韩成人久久| 欧美性猛交xxxx富婆弯腰| 日韩av一区二区三区在线观看| 一级日韩一级欧美| 在线观看不卡| 久久久中文字幕| 国产精成人品免费观看| 99re66热这里只有精品4| 色系网站成人免费| 亚洲熟妇无码av在线播放| 日本a一级在线免费播放| 青青青伊人色综合久久| 欧美日本亚洲视频| brazzers精品成人一区| 视频欧美精品| 亚洲一区二区三区影院| 日韩欧美电影一区二区| 91caoporn在线| av一区二区三区四区| 国产成人欧美在线观看| 手机在线免费看毛片| 欧美三级小说| 日韩中文在线中文网三级| 啪啪一区二区三区| 欧美日韩第一区| 91精品国产91久久久久福利| 来吧亚洲综合网| 日韩深夜影院| 91精品国产入口| 在线精品视频播放| 国产va免费精品观看精品| 色视频一区二区| 欧美精品一区二区三区三州| 麻豆传媒在线免费| 亚洲成人动漫av| 中文字幕一区二区三区5566| 亚州男人的天堂| 国产精品123| 精品亚洲第一| 欧美一区二区在线观看视频| 激情文学综合丁香| 国产成人精品最新| 国产情侣一区二区| 老司机免费视频一区二区三区| 欧美与黑人午夜性猛交久久久| 久久久久亚洲av片无码下载蜜桃| 99欧美视频| 97在线视频免费播放| 亚洲免费视频二区| 天堂久久久久va久久久久| 成人精品aaaa网站| 中文字幕第2页| 日韩一区精品字幕| 国产精品99久久久久久久久久久久 | 色猫av在线| 一区二区三区在线观看视频| 亚洲 日韩 国产第一区| 黄色视屏网站在线免费观看| 91网址在线看| 久久久久久九九九九| 国产在线高清视频| 国产精品久久免费看| 色姑娘综合网| 激情aⅴ欧美一区二区欲海潮| 亚洲第一在线综合网站| 污污的网站免费| 91成人抖音| 欧美日韩一区视频| 色综合五月婷婷| 玖玖玖视频精品| 日韩精品一区二区三区在线播放| 国产无套精品一区二区三区| 日韩精品三级| 三级精品视频久久久久| 性色av免费观看| 日韩va亚洲va欧美va久久| 黄色99视频| 国产三级伦理在线| 狠狠久久五月精品中文字幕| 国产精品亚洲αv天堂无码| 台湾佬中文娱乐久久久| 欧美人与禽zozo性伦| 日本二区在线观看| 日日摸夜夜添夜夜添亚洲女人| 狠狠色伊人亚洲综合网站色| 9999热视频在线观看| 色综合久久中文字幕| 三级黄色片网站| 色综合五月天| 国语自产精品视频在线看抢先版图片 | 91福利在线播放| 成年人网站免费看| 欧美综合久久| 美女性感视频久久久| 久久久久久久国产视频| 国产传媒欧美日韩成人| 黄色录像特级片| 手机在线理论片| 欧美人成免费网站| 北条麻妃在线观看视频| 韩国精品一区二区| 激情视频小说图片| 亚洲不卡在线| 午夜精品久久久久久久99黑人| 色综合视频在线| 国产精品视频免费看| 欧美成人福利在线观看| 久久久久久毛片免费看 | 涩涩网在线视频| 欧美视频一区在线| 天堂av免费在线| 国产毛片精品国产一区二区三区| 特大黑人娇小亚洲女mp4| 999久久精品| 深夜精品寂寞黄网站在线观看| 最近中文字幕在线视频| 亚洲欧美在线视频| 狠狠97人人婷婷五月| 四虎国产精品免费久久5151| 久久资源免费视频| 日日夜夜狠狠操| 成人一级黄色片| 北条麻妃69av| 日韩欧美综合| 成人精品一二区| 日韩一级免费毛片| 色综合久久中文字幕综合网| 日韩精品久久久久久久的张开腿让| 九九热在线视频观看这里只有精品 | 波多野结衣二区三区| 国产成人av电影免费在线观看| 欧美精品卡一卡二| 精品国产精品| 欧美中文字幕视频在线观看| 亚洲精品国偷拍自产在线观看蜜桃 | 极品少妇一区二区三区精品视频| 黄色污污在线观看| 国产探花一区二区| 亚洲综合国产精品| 免费不卡视频| 亚洲精品电影网站| 九九九免费视频| 国产亚洲午夜高清国产拍精品| 国产精品69久久久| 欧美精选一区二区三区| 成人91免费视频| ww久久综合久中文字幕| 国内精品国产三级国产在线专 | 久久精品国亚洲| 三级视频网站在线| 日韩午夜在线观看| 中文字幕一区二区三区波野结| 亚洲国产色一区| 黑人狂躁日本娇小| 国产日韩欧美一区二区三区乱码 | av观看免费在线| 午夜欧美精品| 91麻豆精品秘密入口| 超碰caoporn久久| 日韩欧美一二区| 久久国产香蕉视频| 狠狠操狠狠色综合网| 国产无码精品在线观看| 成人黄色小视频在线观看| 丰满少妇大力进入| 91tv官网精品成人亚洲| 97se亚洲综合| 一区二区三区日本视频| 久久6免费高清热精品| 成年人视频网站在线| 欧美精品日日鲁夜夜添| 欧美国产日韩在线观看成人| 国产午夜精品理论片a级大结局| 88av在线播放| 成人自拍视频在线| 伊人av在线播放| 在线欧美一区| 久久www视频| 日韩av黄色在线| 国产精品免费小视频| 成人在线免费看片| 日韩在线中文字| 秋霞影院午夜丰满少妇在线视频| 中文字幕日韩在线观看| 99热这里只有精品99| 亚洲午夜国产一区99re久久| 唐朝av高清盛宴| 99精品在线观看视频| 老司机午夜av| 91不卡在线观看| 正在播放一区二区三区| 99久久99久久精品国产片桃花| 色综合电影网| 波多野结衣在线播放一区| 亚洲欧洲在线一区| 136国产福利精品导航网址应用| 91视频九色网站| 国产精品一区二区av影院萌芽| 欧美在线观看网站| 高清不卡亚洲| 国产欧美精品在线| 97久久中文字幕| 91亚洲永久免费精品| 亚洲性视频在线| 国产一区二区三区四区hd | 日韩视频在线观看国产| 成人激情免费视频| 99中文字幕在线观看| 亚洲精品激情| 亚洲午夜精品久久| 99热国内精品| 2019日韩中文字幕mv| 香蕉久久a毛片| 一区二区三区四区五区精品| 1024精品久久久久久久久| www.国产二区| 亚洲欧美成人| 777视频在线| 国产成人精品免费视频网站| 精品国产人妻一区二区三区| 久久精品日韩一区二区三区| 中文字幕求饶的少妇| 亚洲一区二区在线视频| 国产精品视频免费播放| 精品视频资源站| 成人小说亚洲一区二区三区| 777午夜精品免费视频| 日本熟妇一区二区三区| 91精品国产综合久久精品图片| 日本人妻丰满熟妇久久久久久| 一区二区福利视频| 精品视频二区| 两个人的视频www国产精品| 成人一级福利| 国产欧美日韩精品在线观看| xvideos.蜜桃一区二区| 日本一区二区三区视频在线播放| 欧美a级一区| 国产日韩一区二区在线| 国产一区三区三区| 国产美女视频免费看| 日韩精品每日更新| 久久婷婷中文字幕| 26uuu国产日韩综合| 国产一区二区播放| 在线免费视频一区二区| 丰满肥臀噗嗤啊x99av| 色一情一乱一区二区| 天堂电影一区| 动漫美女被爆操久久久| 成人在线视频免费观看| 亚洲中文字幕无码专区| 国产成人免费在线视频| 国产又黄又粗又猛又爽的| 日韩欧美国产黄色| 超碰免费在线97| 欧美成人video| 视频三区在线| 久久国产精品99国产精| 亚洲伦理影院| 久久国产精品99久久久久久丝袜| 欧美1区2区视频| 在线播放av中文字幕| 亚洲国产精品传媒在线观看| 99超碰在线观看| 欧美精品一区二区三区蜜臀 | 日韩成人在线一区| 少妇免费毛片久久久久久久久 | 在线观看免费av网址| 国产亚洲精品7777| 天堂网中文字幕| 亚洲精品久久久久久久久| 超黄网站在线观看| 国产高清精品一区二区| 亚洲成av人片乱码色午夜| 色综合色综合色综合色综合| 国产日韩精品一区二区浪潮av| www.国产色| 亚洲欧美日韩精品久久奇米色影视| 日韩一区二区三区中文字幕| 午夜精品美女自拍福到在线| 日本伊人久久| 91嫩草国产丨精品入口麻豆| 韩国成人在线视频| 一起操在线播放| 亚洲大片精品永久免费| 亚洲av综合色区无码一区爱av| 美女久久久久久久| japanese色系久久精品| 可以看毛片的网址| av亚洲精华国产精华| 91久久国产视频| 欧美性xxxxxxxx| aⅴ在线视频男人的天堂| 国产精品一区二区三区久久| 日韩一区二区中文| а 天堂 在线| 亚洲在线一区二区三区| 波多野结衣绝顶大高潮| 国产亚洲aⅴaaaaaa毛片| 中韩乱幕日产无线码一区| www.成人三级视频| 伊人成年综合电影网| a视频免费观看| 欧美在线免费播放| 日本三级视频在线观看| 99久久综合狠狠综合久久止| 在线精品在线| 精品人妻一区二区三区四区| 欧美日韩成人一区| 特级毛片在线| 精品欧美一区二区久久久伦 | 亚洲超碰精品一区二区| 亚洲中文无码av在线| 久久综合伊人77777| 国产精品自在线拍| 在线观看亚洲视频啊啊啊啊| 韩国v欧美v日本v亚洲v| 在线看成人av| 日韩亚洲欧美一区| 色多多在线观看| 夜夜爽99久久国产综合精品女不卡 | 一区二区三区在线视频播放| 人妻一区二区三区| 国产精品美女久久久久av超清| 欧美久久综合| 91精品人妻一区二区三区| 亚洲国产另类av| 二区在线视频| 日本成熟性欧美| 91精品国产91久久久久久密臀| 国产成人av片| 91福利区一区二区三区| av在线播放国产| 免费在线观看91| 国产日韩欧美| 老司机免费视频| 欧美色图一区二区三区| 草草视频在线|