Group管理,查看GroupID下單個消費端堆棧信息,期望只展示與該GroupID相關" />

免费国产成人av_国产又黄又猛的视频_免费国产a级片_国产日韩一区二区在线观看_久久av喷吹av高潮av_国产亚洲视频一区_成人网站免费观看入口_91高清国产视频_www国产黄色_久久av秘一区二区三区_日本男女交配视频_免费看av软件

RocketMQ控制臺消費者堆棧信息展示優化分析-當前播報

首頁 > 探索 > > 正文

日期:2023-03-28 10:14:01    來源:今日頭條    
背景介紹

專有云企業版v_3_12,消息隊列RocketMQ控制臺->Group管理,查看Group ID下單個消費端堆棧信息,期望只展示與該Group ID相關的堆棧信息,在以下場景與期望不符。


(相關資料圖)

場景介紹

在同一個程序中創建兩個不同Group ID的消費端實例,在控制臺中查看一個Group ID下單個消費端堆棧信息,堆棧信息中包含了兩個Group ID消費端的堆棧信息,給排查問題造成了困擾。

示例代碼pom
  com.aliyun.openservices  ons-client  1.8.8.3.Final
code
import com.aliyun.openservices.ons.api.Action;import com.aliyun.openservices.ons.api.PropertyKeyConst;import com.aliyun.openservices.ons.api.batch.BatchMessageListener;import com.aliyun.openservices.ons.api.bean.BatchConsumerBean;import com.aliyun.openservices.ons.api.bean.Subscription;import java.util.HashMap;import java.util.Map;import java.util.Properties;public class Main {    public static void main(String[] args){        String nameSrvAddr = "xxx";        String accessKey = "xxx";        String secretKey = "xxx";        String groupId1 = "Goup_ID_1";        String topic1 = "xxx_1";        String tag1 = "xxx_1";        BatchMessageListener batchMessageListener1 = (messages, context) -> Action.CommitMessage;        BatchConsumerBean batchConsumerBean1 = batchConsumerBean(nameSrvAddr,accessKey,secretKey,                                                                 groupId1,topic1,tag1,batchMessageListener1);        batchConsumerBean1.start();        String groupId2 = "Goup_ID_2";        String topic2 = "xxx_2";        String tag2 = "xxx_2";        BatchMessageListener batchMessageListener2 = (messages, context) -> Action.CommitMessage;        BatchConsumerBean batchConsumerBean2 = batchConsumerBean(nameSrvAddr,accessKey,secretKey,                                                                 groupId2,topic2,tag2,batchMessageListener2);        batchConsumerBean2.start();    }    private static BatchConsumerBean batchConsumerBean(String nameSrvAddr,String accessKey,String secretKey,String groupId,String topic,String tag,BatchMessageListener batchMessageListener){        BatchConsumerBean batchConsumerBean = new BatchConsumerBean();        Properties properties = new Properties();        properties.put(PropertyKeyConst.NAMESRV_ADDR,nameSrvAddr);        properties.put(PropertyKeyConst.AccessKey,accessKey);        properties.put(PropertyKeyConst.SecretKey,secretKey);        properties.put(PropertyKeyConst.GROUP_ID,groupId);        batchConsumerBean.setProperties(properties);        Subscription subscription = new Subscription();        subscription.setTopic(topic);        subscription.setExpression(tag);        Map subscriptionTable = new HashMap<>();        subscriptionTable.put(subscription,batchMessageListener);        batchConsumerBean.setSubscriptionTable(subscriptionTable);        return batchConsumerBean;    }}
分析過程

首先分析示例代碼中與BatchConsumerBean相關聯的對象,然后分析控制臺展示消費端堆棧信息的流程,最后分析下不同版本的RocketMQ Client SDK對消費端消費線程命名方式的變化。

BatchConsumerBean

示例代碼中創建了兩個BatchConsumerBean實例,與BatchConsumerBean實例相關聯的對象如下:

與BatchConsumerBean關聯的對象

從上圖看,BatchConsumerBean實例是比較重的,所以上面的示例代碼可以優化為只創建一個BatchConsumerBean實例,與該問題不太相關,暫時忽略;上圖中與該問題直接相關的是ClientRemotingProcessor、MQClientInstance、DefaultMQPushConsumerImpl、ConsumerStatsManager,下面繼續分析。

堆棧信息展示流程

下面描述的是在瀏覽器請求一個Group ID單個消費端堆棧信息的流程。

堆棧信息展示流程

瀏覽器請求控制臺應用

當在控制臺單機某個消費端堆棧信息的時候,瀏覽器會向控制臺應用發起http請求,主要請求參數是:GroupID,ClientId,其中每個MQClientInstance實例對應一個ClientId。

控制臺應用請求Broker

控制臺應用收到瀏覽器請求后,主要進行以下操作:

String topic = MixAll.RETRY_GROUP_TOPIC_PREFIX + consumerGroup;TopicRouteData topicRouteData = this.examineTopicRouteInfo(topic);List brokerDatas = topicRouteData.getBrokerDatas();if (brokerDatas != null) {    for (BrokerData brokerData : brokerDatas) {        String addr = brokerData.selectBrokerAddr();        if (addr != null) {            return this.mqClientInstance.getMQClientAPIImpl().getConsumerRunningInfo(addr, consumerGroup, clientId, jstack,timeoutMillis * 3);        }    }}
根據%RETRY% + GroupIID查找對應的TopicRouteData從TopicRouteData中選擇一個Broker的地址發送getConsumerRunningInfo請求Broker請求Consumer

Broker收到請求后,主要進行以下操作:

ClientChannelInfo clientChannelInfo = this.brokerController.getConsumerManager().findChannel(consumerGroup, clientId);RemotingCommand newRequest = RemotingCommand.createRequestCommand(requestCode, null);newRequest.setExtFields(request.getExtFields());newRequest.setBody(request.getBody());return this.brokerController.getBroker2Client().callClient(clientChannelInfo.getChannel(), newRequest);
AdminBrokerProcessor響應查詢請求根據GroupID和ClientId找到對應Consumer實例的channel socket通過channel socket發送請求到Consumer實例Consumer處理邏輯

Consumer收到請求后,主要進行以下操作:

ConsumerRunningInfo consumerRunningInfo = this.mqClientFactory.consumerRunningInfo(requestHeader.getConsumerGroup());if (requestHeader.isJstackEnable()) {  Map map = Thread.getAllStackTraces();  String jstack = UtilAll.jstack(map);  consumerRunningInfo.setJstack(jstack);}
通過MQClientInstance實例請求Consumer實例的consumerRunningInfo方法獲取Consumer運行信息,如:pullRT、pullTPS、consumeRT、consumeOKTPS、consumeFailedTPS等信息獲取JVM所有線程棧信息將獲取到的ConsumerRunningInfo返回給Broker。

其中第2步【獲取JVM所有線程棧信息】就是我們需要查看的堆棧信息,目前控制臺主要展示了以ConsumeMessageThread__開頭的線程和RebalanceService線程,這塊期望只展示與該消費端相關的ConsumeMessageThread__線程和Rebalance線程,不期望將不相關的消費端線程也展示出來。

ConsumeMessageThread線程的命名

在當前版本中處理業務的消費者線程名的形式是:ConsumeMessageThread_數字,ConsumeMessageConcurrentlyService類中相關代碼如下:

//該線程池用于處理業務邏輯this.consumeExecutor = new ThreadPoolExecutor(  this.defaultMQPushConsumer.getConsumeThreadMin(),  this.defaultMQPushConsumer.getConsumeThreadMax(),  1000 * 60,  TimeUnit.MILLISECONDS,  this.consumeRequestQueue,  new ThreadFactoryImpl("ConsumeMessageThread_"));

新版本中線程的命名中增加了GroupId,相關代碼如下:

String consumeThreadPrefix = null;if (consumerGroup.length() > 100) {    consumeThreadPrefix = new StringBuilder("ConsumeMessageThread_").append(consumerGroup, 0, 100).append("_").toString();} else {    consumeThreadPrefix = new StringBuilder("ConsumeMessageThread_").append(consumerGroup).append("_").toString();}this.consumeExecutor = new ThreadPoolExecutor(    this.defaultMQPushConsumer.getConsumeThreadMin(),    this.defaultMQPushConsumer.getConsumeThreadMax(),    1000 * 60,    TimeUnit.MILLISECONDS,    this.consumeRequestQueue,    new ThreadFactoryImpl(consumeThreadPrefix));

線程名形式為:ConsumeMessageThread_GroupId__數字,從一定程度對以上問題進行了優化。

總結ONS SDK對RocketMQ Client進行了封裝,更加方便業務的使用,Consumer對象比較重,需要根據業務采用合理的初始化方式ConsumerStatsManager記錄了消費端的一些統計信息ConsumeMessageConcurrentlyService對消費端線程命名進行了優化?

關鍵詞:

下一篇:諸多精進行跡(六)
上一篇:最后一頁

科技

 
免费国产成人av_国产又黄又猛的视频_免费国产a级片_国产日韩一区二区在线观看_久久av喷吹av高潮av_国产亚洲视频一区_成人网站免费观看入口_91高清国产视频_www国产黄色_久久av秘一区二区三区_日本男女交配视频_免费看av软件
日本一不卡视频| 欧美日一区二区在线观看| 日韩av片子| 视频一区视频二区中文| 国产精品视频一区视频二区| 91精品综合| 国产精品美女久久久久久不卡| av亚洲在线观看| 精品美女久久| 国产精品一级在线观看| 亚洲97av| 另类激情亚洲| 狠狠久久婷婷| 日韩国产一区二区| 久久精品国产99国产| 日韩一区二区三免费高清在线观看| 91精品精品| 日韩深夜视频| 视频在线不卡免费观看| 欧美一区不卡| 奇米色欧美一区二区三区| 亚洲欧美日韩视频二区| 国产一在线精品一区在线观看 | 日韩一区二区三区免费视频 | 国产午夜一区| 蜜桃视频第一区免费观看| 五月婷婷六月综合| 亚洲成人不卡| 成年男女免费视频网站不卡| 美日韩一区二区三区| 国产精品三级| 美腿丝袜在线亚洲一区| 成人台湾亚洲精品一区二区| 国产精品久久久久久模特| 久久国内精品自在自线400部| 日本aⅴ精品一区二区三区| 日本精品在线播放| 国产三级精品三级在线观看国产| 欧美综合精品| 国产精品日本一区二区三区在线| 国产精品观看| 亚洲一级少妇| 欧美成人久久| 蜜桃视频一区二区三区在线观看 | 伊人影院久久| 视频一区二区国产| 日韩一区二区三区免费视频 | 亚洲精华国产欧美| 亚洲欧美日韩国产一区| 美美哒免费高清在线观看视频一区二区| 免费观看在线综合色| 国产精品伊人| 日韩毛片视频| 亚洲视频www| 国产精选一区| 国产 日韩 欧美一区| 91久久中文| 国产精品一区二区美女视频免费看 | 日韩免费看片| 99久久激情| 久久av一区二区三区| 亚洲ww精品| 九九99久久精品在免费线bt| 久久蜜桃精品| 亚洲精选91| 福利一区在线| 模特精品在线| 国产在线观看91一区二区三区 | 国产91一区| 日韩精品一区二区三区av | 久久成人精品| 精品国产中文字幕第一页| 99精品视频在线观看免费播放| 亚洲欧美日韩高清在线| 国产精品蜜月aⅴ在线| 精品成人免费一区二区在线播放| 亚洲欧美日韩视频二区| 97国产成人高清在线观看| 美国av一区二区| 亚洲成人精品| 国产精品一区毛片| 欧美综合国产| 日韩免费小视频| 91精品麻豆| 亚洲免费在线| 婷婷成人在线| 国产成人精品福利| 日韩国产在线观看一区| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 美女精品网站| 成人精品亚洲| 里番精品3d一二三区| 免费美女久久99| 99视频精品全部免费在线视频| 国产欧美大片| 中文字幕免费精品| 国产在线欧美| 中文字幕系列一区| 久久久男人天堂| 国产精品白丝一区二区三区| 亚洲精品一区二区在线播放∴| 激情六月综合| 亚洲综合电影| 精品国产午夜| 国产精品一级在线观看| 日本精品另类| 日本va欧美va精品| 亚洲a成人v| 综合激情视频| 免费看黄色91| 老司机精品久久| 国产偷自视频区视频一区二区| 日韩另类视频| 日韩av福利| 久久中文字幕av| 蜜桃视频欧美| 亚洲精品123区| 黄色av日韩| 亚洲一区二区成人| 日韩精品一级中文字幕精品视频免费观看| 久久婷婷av| 亚洲一级影院| 久久国产99| 日韩av三区| 国产精品一区二区美女视频免费看| 国产亚洲观看| 精品国产一区二区三区2021| 国产一二在线播放| 久久中文字幕av一区二区不卡| 欧美69视频| 亚洲尤物av| 国产精品九九| 91精品韩国| 国产精品嫩草99av在线| 日韩中文欧美在线| 日本va欧美va精品发布| 免费在线欧美黄色| 久久激情婷婷| 亚洲日产av中文字幕| 日韩高清在线不卡| 国产一区调教| 久久精品不卡| 日本不卡在线视频| 久久久久久色| 久久a爱视频| 日韩综合在线| 国产色综合网| 国产精品分类| 欧美成人日韩| 日韩av网站在线免费观看| 国产成人久久| 久久国产高清| 国产成人精品999在线观看| 欧美亚洲国产激情| 日韩精品电影一区亚洲| 偷拍精品精品一区二区三区| 久久国产精品亚洲77777| 日本不卡视频在线观看| 精品深夜福利视频| 久久99伊人| 色在线视频观看| 日韩欧美三区| 久久天堂成人| 国产精品115| 伊人久久成人| 国产精品国产一区| 中文字幕日本一区二区| 综合日韩av| 911亚洲精品| 国产视频久久| 99久久精品费精品国产| 日韩国产高清在线| 国产一在线精品一区在线观看| 欧美亚洲一级| 国产模特精品视频久久久久| 精品久久久久中文字幕小说| 丝袜美腿成人在线| 久久精品欧美一区| 精品国产亚洲日本| 国产日韩欧美一区| 免费日韩视频| 激情综合自拍| 亚洲www免费| 国产不卡一区| 国产精品日本一区二区不卡视频| 午夜久久美女| 美女av在线免费看| 国产一区二区三区成人欧美日韩在线观看 | 麻豆亚洲精品| 日韩伦理一区| 国产精品久久久亚洲一区| 午夜在线一区| 午夜视频精品| 在线日韩欧美| 韩国久久久久久| 欧美极品一区二区三区| 日韩毛片网站| 亚洲欧美一级| 老鸭窝亚洲一区二区三区| 一区三区视频|