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

兩個實驗讓我徹底弄懂了「訂閱關系一致」

開發 前端
RocketMQ 4.X 源碼實現就是為了和消費組的定義保持一致 ,假如訂閱關系不一致,那么代碼執行邏輯就會出現混亂。

這篇文章,筆者想聊聊 RocketMQ 最佳實踐之一:保證訂閱關系一致。

訂閱關系一致指的是同一個消費者 Group ID 下所有 Consumer 實例所訂閱的 Topic 、Tag 必須完全一致。

如果訂閱關系不一致,消息消費的邏輯就會混亂,甚至導致消息丟失。

1 訂閱關系演示

首先我們展示正確的訂閱關系:多個 Group ID 訂閱了多個 Topic,并且每個 Group ID 里的多個消費者的訂閱關系保持了一致。

正確的訂閱關系正確的訂閱關系

接下來,我們展示錯誤的訂閱關系。

錯誤的訂閱關系錯誤的訂閱關系

從上圖中,單個 Group ID 訂閱了多個 Topic,但是該 Group ID 里的多個消費者的訂閱關系并沒有保持一致。

代碼邏輯角度來看,每個消費者實例內訂閱方法的主題、 TAG、監聽邏輯都需要保持一致。

圖片圖片

接下來,我們實驗相同消費組,兩種不正確的場景,看看消費者和 Broker 服務有什么異常。

訂閱主題不同,標簽相同

訂閱主題相同,標簽不同

2 訂閱主題不同,標簽相同

圖片圖片

當我們啟動兩個消費者后,消費者組名:myconsumerGroup。

C1消費者訂閱主題 TopicTest , C2消費者訂閱主題  mytest。

在 Broker 端的日志里,會不停的打印拉取消息失敗的日志 :

2023-10-09 14:52:53 WARN PullMessageThread_2 - 
the consumer's subscription not exist, group: myconsumerGroup, topic:TopicTest

那么在這種情況下,C1 消費者是不可能拉取到消息,也就不可能消費到最新的消息。

為什么呢 ?我們知道客戶端會定時的發送心跳包到 Broker 服務,心跳包中會包含消費者訂閱信息,數據格式樣例如下:

"subscriptionDataSet": [
  {
    "classFilterMode": false,
    "codeSet": [],
    "expressionType": "TAG",
    "subString": "*",
    "subVersion": 1696832107020,
    "tagsSet": [],
    "topic": "TopicTest"
  },
  {
    "classFilterMode": false,
    "codeSet": [],
    "expressionType": "TAG",
    "subString": "*",
    "subVersion": 1696832098221,
    "tagsSet": [],
    "topic": "%RETRY%myconsumerGroup"
  }
]

Broker 服務會調用 ClientManageProcessor 的 heartBeat方法處理心跳請求。

最終跟蹤到代碼:org.apache.rocketmq.broker.client.ConsumerManager#registerConsumer

圖片圖片

Broker 服務的會保存消費者信息,消費者信息存儲在消費者表 consumerTable 。消費者表以消費組名為 key , 值為消費者組信息 ConsumerGroupInfo 。

#org.apache.rocketmq.broker.client.ConsumerManager
private final ConcurrentMap<String/* Group */, ConsumerGroupInfo> consumerTable =
    new ConcurrentHashMap<String, ConsumerGroupInfo>(1024);

如果消費組的消費者信息 ConsumerGroupInfo 為空,則新建新的對象。

更新訂閱信息時,訂閱信息是按照消費組存放的,這步驟就會導致同一個消費組內的各個消費者客戶端的訂閱信息相互被覆蓋。

回到消費者客戶端,當消費者拉取消息時,Broker 服務會調用 PullMessageProcessor 的 processRequest 方法 。

首先會進行前置判斷,查詢當前的主題的訂閱信息若該主題的訂閱信息為空,則打印告警日志,并返回異常的響應結果。

subscriptionData = consumerGroupInfo.findSubscriptionData(requestHeader.getTopic());    
if (null == subscriptionData) {
     log.warn("the consumer's subscription not exist, group: {}, topic:{}", requestHeader.getConsumerGroup(), 
     response.setCode(ResponseCode.SUBSCRIPTION_NOT_EXIST);
     response.setRemark("the consumer's subscription not exist" + FAQUrl.suggestTodo(FAQUrl.SAME_GROUP_DIFFERENT_TOPIC));
     return response;
}

通過調研 Broker 端的代碼,我們發現:相同消費組的訂閱信息必須保持一致 , 否則同一個消費組內的各個消費者客戶端的訂閱信息相互被覆蓋,從而導致某個消費者客戶端無法拉取到新的消息。

C1消費者無法消費主題 TopicTest 的消息數據,那么 C2 消費者訂閱主題 mytest,消費會正常嗎 ?

圖片圖片

從上圖來看,依然有問題。主題 mytest 有四個隊列,但只有兩個隊列被分配了, 另外兩個隊列的消息就沒有辦法消費了。

要解釋這個問題,我們需要重新溫習負載均衡的原理。

負載均衡服務會根據消費模式為”廣播模式”還是“集群模式”做不同的邏輯處理,這里主要來看下集群模式下的主要處理流程:

(1) 獲取該主題下的消息消費隊列集合;

(2) 查詢 Broker 端獲取該消費組下消費者 Id 列表;

(3) 先對 Topic 下的消息消費隊列、消費者 Id 排序,然后用消息隊列分配策略算法(默認為:消息隊列的平均分配算法),計算出待拉取的消息隊列;

圖片圖片

這里的平均分配算法,類似于分頁的算法,將所有 MessageQueue 排好序類似于記錄,將所有消費端排好序類似頁數,并求出每一頁需要包含的平均 size 和每個頁面記錄的范圍 range ,最后遍歷整個 range 而計算出當前消費端應該分配到的記錄。

(4) 分配到的消息隊列集合與 processQueueTable 做一個過濾比對操作。

圖片圖片

消費者實例內 ,processQueueTable 對象存儲著當前負載均衡的隊列 ,以及該隊列的處理隊列 processQueue (消費快照)。

  1. 標紅的 Entry 部分表示與分配到的消息隊列集合互不包含,則需要將這些紅色隊列 Dropped 屬性為 true , 然后從 processQueueTable 對象中移除。
  2. 綠色的 Entry 部分表示與分配到的消息隊列集合的交集,processQueueTable 對象中已經存在該隊列。
  3. 黃色的 Entry 部分表示這些隊列需要添加到 processQueueTable 對象中,為每個分配的新隊列創建一個消息拉取請求 pullRequest , 在消息拉取請求中保存一個處理隊列 processQueue (隊列消費快照),內部是紅黑樹(TreeMap),用來保存拉取到的消息。

最后創建拉取消息請求列表,并將請求分發到消息拉取服務,進入拉取消息環節。

通過上面的介紹 ,通過負載均衡的原理推導,原因就顯而易見了。

圖片圖片

C1消費者被分配了隊列 0、隊列 1 ,但是 C1消費者本身并沒有訂閱主題 mytest , 所以無法消費該主題的數據。

從本次實驗來看,C1消費者無法消費主題 TopicTest 的消息數據 , C2 消費者只能部分消費主題 mytest的消息數據。

但是因為在 Broker 端,同一個消費組內的各個消費者客戶端的訂閱信息相互被覆蓋,所以這種消費狀態非常混亂,偶爾也會切換成:C1消費者可以部分消費主題 TopicTest 的消息數據 , C2消費者無法消費主題  mytest的消息數據。

3 訂閱主題相同,標簽不同

圖片圖片

如圖,C1 消費者和 C2 消費者訂閱主題 TopicTest ,但兩者的標簽 TAG 并不相同。

啟動消費者服務之后,從控制臺觀察,負載均衡的效果也如預期一般正常。

圖片圖片

筆者在 Broker 端打印埋點日志,發現主題 TopicTest 的訂閱信息為 :

{
  "classFilterMode": false,
  "codeSet": [66],
  "expressionType": "TAG",
  "subString": "B",
  "subVersion": 1696901014319,
  "tagsSet": ["B"],
  "topic": "TopicTest"
}

那么這種狀態,消費正常嗎 ?筆者做了一組實驗,消費依然混亂:

C1 消費者無法消費 TAG 值為 A 的消息 ,C2 消費者只能消費部分 TAG 值為 B 的消息。

想要理解原因,我們需要梳理消息過濾機制。

首先 ConsumeQueue 文件的格式如下 :

圖片圖片

  1. Broker 端在接收到拉取請求后,根據請求參數定位 ConsumeQueue 文件,然后遍歷 ConsumeQueue 待檢索的條目, 判斷條目中存儲 Tag 的 hashcode 是否和訂閱信息中 TAG 的 hashcode 是否相同,若不符合,則跳過,繼續對比下一個, 符合條件的聚合后返回給消費者客戶端。
  2. 消費者在收到過濾后的消息后,也要執行過濾機制,只不過過濾的是 TAG 字符串的值,而不是 hashcode 。

我們模擬下消息過濾的過程:

圖片圖片

首先,生產者將不同的消息發送到 Broker 端,不同的 TAG 的消息會發送到保存的不同的隊列中。

C1 消費者從隊列 0 ,隊列 1 中拉取消息時,因為 Broker 端該主題的訂閱信息中 TAG 值為 B ,經過服務端過濾后, C1 消費者拉取到的消息的 TAG 值都是 B  , 但消費者在收到過濾的消息后,也需要進行客戶端過濾,A 并不等于 B ,所以 C1 消費者無法消費 TAG 值為 A 的消息。

C2 消費者從隊列 2, 隊列 3 中拉取消息,整個邏輯鏈路是正常的 ,但是因為負載均衡的緣故,它無法消費隊列 0 ,隊列 1的消息。

4 總結

什么是消費組 ?消費同一類消息且消費邏輯一致 。

RocketMQ 4.X 源碼實現就是為了和消費組的定義保持一致 ,假如訂閱關系不一致,那么代碼執行邏輯就會出現混亂。

規避訂閱關系不一致這個問題有兩種方式 :

  • 嚴格規范上線流程在上線之前,梳理好相關依賴服務,梳理好上線流程,做好上線評審,并嚴格按照流程執行。
  • 合理定義好主題和標簽當我們定義好主題和標簽后,需要添加新的標簽時,是否可以換一個思路:換一個新的消費組或者新建一個主題。

最后的思考:

假如從基礎架構層面來思考,將訂閱關系信息中心化來設計,應該也可以實現 ,但成本較高,對于中小企業來講,并不合算。

參考資料:

RocketMQ為什么要保證訂閱關系的一致性

https://cloud.tencent.com/developer/article/1474885

RocketMQ最佳實踐之坑?

https://mp.weixin.qq.com/s/Ypk-U8uVu4aZKMinbfU3xQ

源碼分析RocketMQ消息過濾機制

https://blog.csdn.net/prestigeding/article/details/79255328


責任編輯:武曉燕 來源: 勇哥java實戰分享
相關推薦

2021-02-02 05:41:16

底層設計頂層

2021-02-07 21:59:39

Java回調機制

2018-07-05 09:41:08

一致性哈希算法

2021-10-26 00:17:21

Linux網絡命名

2020-07-02 09:15:59

Netty內存RPC

2022-12-05 16:49:05

volatileJava

2021-01-18 07:52:08

Dom節點Element

2023-02-28 23:04:15

2023-12-12 07:31:51

Executors工具開發者

2023-11-06 09:06:54

分布式一致性數據

2024-04-11 08:01:24

RedisMysql分布式鎖

2019-10-28 09:26:35

PylintPython編程語言

2018-01-29 15:25:05

前端JSDate對象

2019-11-08 16:05:54

Promise前端鏈式調用

2019-09-12 09:40:34

秒殺系統高并發

2022-01-27 08:31:20

一致性哈希

2023-12-05 14:44:01

2017-10-23 10:34:36

服務器數據同步

2025-05-28 02:20:00

2023-11-08 07:56:38

單鏈表雙鏈表
點贊
收藏

51CTO技術棧公眾號

美女一区视频| 香蕉久久一区| 久久综合九色综合欧美98| 欧美与欧洲交xxxx免费观看| 婷婷色一区二区三区| 久久av影院| 亚洲一区二区三区四区五区中文| 国产精品视频免费一区| 国产精品成人无码| 欧美日韩亚洲一区三区| 亚洲欧美中文日韩v在线观看| 九九九在线观看视频| 香蕉成人app免费看片| 99re视频这里只有精品| 91久久精品国产91久久| 国产小视频在线免费观看| 久久中文字幕二区| 日韩va亚洲va欧洲va国产| 黄色一级片免费的| 在线看片国产福利你懂的| 亚洲欧洲99久久| 九九热久久66| www.好吊色| 日韩av在线播放中文字幕| 欧美丰满少妇xxxxx| 91l九色lporny| 好吊妞视频这里有精品 | 免费久久精品视频| 久久久久久com| 婷婷激情四射网| 五月天亚洲一区| 日韩精品一区二区三区在线| 欧美大片一区二区三区| 男人天堂1024| 久久香蕉一区| 亚洲黄色av一区| 亚洲黄色一区二区三区| 清纯唯美亚洲色图| 国产成人97精品免费看片| 亚洲一级片av| 欧美日韩电影免费看| 亚洲午夜激情网站| avove在线观看| chinese偷拍一区二区三区| 93久久精品日日躁夜夜躁欧美| 成人国产在线激情| 中文字幕网址在线| 日韩电影免费在线看| 9.1国产丝袜在线观看| 久久网免费视频| 欧美一区综合| 久热精品视频在线观看一区| 青青操在线播放| 久久中文字幕av一区二区不卡| 一区二区av在线| www.狠狠爱| 国产精品欧美在线观看| 亚洲精品色婷婷福利天堂| 爱爱免费小视频| 国产精品欧美日韩一区| 亚洲欧美激情在线视频| 欧美 日本 国产| 性欧美lx╳lx╳| 亚洲欧美制服综合另类| 精品成人av一区二区三区| 亚洲宅男网av| 国产亚洲精品综合一区91| 久久午夜精品视频| 99成人超碰| 欧美猛男性生活免费| 麻豆国产尤物av尤物在线观看| 国产精品激情| 8090成年在线看片午夜| 波多野结衣高清在线| 久久99九九99精品| 91九色极品视频| 天天综合天天综合| 国产亚洲欧美一级| 一区二区三区在线视频看| 国产黄网站在线观看| 亚洲综合久久久久| 91九色在线观看视频| 女生影院久久| 欧美精品久久天天躁| 中文字幕乱妇无码av在线| 精品精品国产毛片在线看| 亚洲老头同性xxxxx| 欧美自拍偷拍网| 国内精品久久久久久久影视蜜臀| 午夜精品蜜臀一区二区三区免费 | 91成人超碰| 久久久亚洲精品视频| youjizz在线视频| 精品一区二区三区在线视频| 国产一区二区三区奇米久涩| 韩国福利在线| 一区二区三区四区乱视频| 国产97在线 | 亚洲| 国产精品第一国产精品| 欧美白人最猛性xxxxx69交| 草草影院第一页| 欧美va亚洲va日韩∨a综合色| 欧美亚洲激情在线| 中文字幕在线观看高清| 成人精品视频.| 亚洲一区二区三区精品动漫| 国产三级伦理在线| 欧美少妇xxx| 欧产日产国产精品98| 日韩精品二区| 91高清免费视频| 国产99999| 国产亚洲精品免费| 久久久久久www| www.久久99| 亚洲欧洲高清在线| 欧美三级小视频| 免费观看在线综合| 极品尤物一区二区三区| 国产福利视频在线| 91国产精品成人| 日本一卡二卡在线| 亚洲国产一成人久久精品| 国产99久久精品一区二区 夜夜躁日日躁| 国产剧情精品在线| 国产精品视频yy9299一区| 成年人视频观看| 中文字幕区一区二区三| 日韩一中文字幕| 久久精品视频2| www久久精品| 精品成在人线av无码免费看| 成人污版视频| 日韩视频在线一区| 日本视频www色| 91社区在线播放| 国产91xxx| 51亚洲精品| 欧美激情视频在线免费观看 欧美视频免费一 | 91高潮精品免费porn| 亚洲精品一区二区口爆| 亚洲六月丁香色婷婷综合久久 | 成人91在线观看| 乱熟女高潮一区二区在线| av在线播放一区二区| 最近2019年中文视频免费在线观看| 91在线视频在线观看| 亚洲成人偷拍| 成人在线视频首页| 亚洲一二三区在线| 欧美粗大gay| 日韩精品有码在线观看| 国产在线免费视频| 国产aⅴ精品一区二区三区色成熟| 亚洲综合第一| 国产激情久久| 日韩一区二区三区国产| 91成品人影院| 中文字幕亚洲一区二区va在线| youjizzxxxx18| 欧美精品一二| 国产精品大陆在线观看| 国产在线一二| 欧美在线你懂得| jizz日本在线播放| 激情国产一区二区| 日韩视频在线观看视频| 国产精品美女久久久久人| 国产精品网站一区| 天天操天天摸天天爽| 日韩亚洲一区在线| 成人网在线免费看| 91高清在线观看视频| 欧美大胆人体bbbb| 尤物视频在线观看国产| 久久亚区不卡日本| 欧美男女交配视频| 欧美1区2区3区| 国产一区精品视频| 丝袜美腿诱惑一区二区三区| 自拍偷拍亚洲一区| 国产成人久久精品77777综合| 夜色激情一区二区| 亚洲精品中文字幕在线播放| 久久av一区二区三区| 香蕉久久免费影视| 国产精品久一| 97超级碰碰碰久久久| 国产小视频在线| 日韩三级久久久| 欧美大片专区| 精品国产一区二区三区四区vr| 欧美xxxhd| 色偷偷9999www| 人人妻人人澡人人爽人人欧美一区| 精品人伦一区二区三区蜜桃免费| 韩国三级hd中文字幕| 国产乱国产乱300精品| 免费无码国产v片在线观看| 999精品色在线播放| 国产一区二区精品免费| 欧美综合社区国产| 国外成人在线视频| 日本福利在线| 日韩av网址在线| 久久91精品国产| 欧美aaa级片| 成人永久免费视频| 在线观看免费黄网站| 激情视频一区| 综合视频免费看| 丝袜美腿一区二区三区动态图| 成人久久精品视频| se01亚洲视频| 久久久久久久久久久av| av在线播放av| 日韩美女av在线| 国产成人精品一区二区无码呦| 色哟哟亚洲精品| 中文字幕日韩一级| 亚洲理论在线观看| 后入内射无码人妻一区| 久久品道一品道久久精品| 一级黄色电影片| 韩日欧美一区二区三区| 日韩一级理论片| aa级大片欧美三级| 男女激情免费视频| 亚洲天天综合| 日韩在线导航| 自拍欧美一区| 国模一区二区三区私拍视频| 国产一精品一av一免费爽爽| 国产成人拍精品视频午夜网站| 国产理论在线| 久久免费视频在线观看| 在线观看a级片| 久久久成人精品视频| 在线日本视频| 日韩一区二区久久久| 午夜视频在线观看免费视频| 国产午夜精品全部视频播放| 神马电影在线观看| 欧美精品一区二区三| 狠狠综合久久av一区二区| 日韩欧美在线1卡| www.超碰在线.com| 欧美大片日本大片免费观看| 亚洲黄色小说网| 精品日韩在线一区| 亚洲精品综合久久| 欧美va亚洲va国产综合| 亚洲国产剧情在线观看| 欧美成人一区二区| 丰满熟女一区二区三区| 欧美精品一区二区三区在线| 四虎永久在线精品免费网址| 亚洲精品国精品久久99热| 日韩精品系列| 国产亚洲精品久久久久久牛牛| 91网页在线观看| 日韩视频中文字幕| 在线电影福利片| 午夜精品久久久久久久99黑人| 色老头在线一区二区三区| 日韩美女视频在线观看| av久久网站| 成人免费视频在线观看超级碰| 欧美电影在线观看一区| 国产精品二区二区三区| 亚洲系列另类av| 亚洲欧美久久久久一区二区三区| 欧美在线首页| 无罩大乳的熟妇正在播放| 久久精品一区二区三区中文字幕 | 欧美日本久久| 欧美a v在线播放| 美女视频网站久久| 麻豆传媒在线看| www久久精品| 国产中文av在线| 偷拍一区二区三区四区| 成人小视频在线播放| 欧美一二三在线| 午夜国产在线观看| 色悠悠国产精品| 国产美女一区视频| 国产成人综合av| 国产亚洲字幕| 日韩av一区二区三区在线 | 久久的精品视频| 国产精品一区二区日韩| 国产日韩欧美成人| 激情小说亚洲色图| 中文精品一区二区三区| 激情综合久久| 日本xxxx黄色| hitomi一区二区三区精品| 国产无遮挡在线观看| 亚洲成人免费电影| 911美女片黄在线观看游戏| 亚洲精品久久在线| 18av在线播放| 国产精品激情自拍| 国产亚洲精品美女久久| 一本久道久久综合| 久久国产精品亚洲77777| 亚洲成人福利视频| 国产精品久久一级| 国语对白永久免费| 日韩欧美123| 麻豆影视国产在线观看| 国产97在线亚洲| 欧美综合自拍| 亚洲熟妇无码av在线播放| 久久精品国产第一区二区三区| 日本一卡二卡在线| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲成人一区二区在线观看| 国产精品女人久久久| 亚洲无av在线中文字幕| 日本在线播放一二三区| 国产精品自拍首页| 国产一区二区三区自拍| 在线观看免费不卡av| 久久精品免费在线观看| 国产www在线| 日韩成人av在线播放| 免费影视亚洲| 91一区二区三区| 亚洲人体av| 成人亚洲免费视频| 国产精品美女一区二区在线观看| 伊人久久久久久久久久久久| 日韩黄色av网站| 乱馆动漫1~6集在线观看| 国产成人av一区二区三区| 欧美国产免费| 91视频免费入口| 樱桃视频在线观看一区| 99久久精品国产一区二区成人| 久久久国产一区二区| 欧美爱爱视频| 在线成人av电影| 久久精品国产精品青草| 国产精品精品软件男同| 5566中文字幕一区二区电影| 国产秀色在线www免费观看| 成人激情视频在线播放| 亚洲激情中文在线| 少妇愉情理伦片bd| 亚洲在线中文字幕| 亚洲不卡免费视频| 久久久久久久久久久国产| jizz性欧美23| 欧美日韩在线一| 久久久久久毛片| 羞羞色院91蜜桃| www.亚洲免费视频| 韩国三级大全久久网站| 久操手机在线视频| 波多野结衣在线一区| 探花视频在线观看| 国产亚洲精品久久久优势| 日韩有码欧美| 老汉色影院首页| 粉嫩一区二区三区性色av| 久草视频在线观| 亚洲日本成人女熟在线观看| 欧美视频在线视频精品| 路边理发店露脸熟妇泻火| 成人精品一区二区三区中文字幕| 久久久久久少妇| www.国产一区| 超碰97久久| 亚洲三级视频网站| 一区二区三区中文在线| 四虎在线免费看| 成人精品视频99在线观看免费| 在线观看的日韩av| 怡红院一区二区三区| 日韩午夜在线观看视频| 在线观看爽视频| 日本一二三区视频在线| 99久久99久久久精品齐齐| 伊人免费在线观看高清版| 精品自在线视频| 九九综合九九| 少妇欧美激情一区二区三区| 天天综合网天天综合色 | 欧美日韩成人网| 亚洲日产av中文字幕| 成人在线短视频| 日韩欧美在线网址| 在线中文免费视频| 日本视频一区在线观看| 风间由美性色一区二区三区| 波多野结衣电车痴汉| 久久久久久国产精品久久| 欧美日韩在线播放视频|