RocketMQ问题篇01 | NameServer告警异常分析

RocketMQ问题篇01 | NameServer告警异常分析

  • 1、问题描述
  • 2、初步分析
    • 2.1 mqcloud源代码分析
    • 2.2 NameServer源码分析
    • 2.3 NameServer源码分析2(源码出错概率太低)
    • 2.4 大流量分析
  • 3、堆栈分析
    • 3.1 wait response on the channel
    • 3.2 connect to failed
    • 3.3 send request to failed
  • 4、channel关闭分析
    • 4.1 mqcloud引用的RocketMQ的Netty客户端实现分析
  • 5、整改措施

1、问题描述

钉钉告警触发时间:2022-06-23 15:46:35.016 开始,每个几个小时告警一次

钉钉告警触发内容:
在这里插入图片描述在这里插入图片描述

2、初步分析

定位mqcloud触发告警代码块,分析堆栈信息:

什么?堆栈信息未在运维项目mqcloud中打印? 那么先从源码与经验进行分析,并同时添加打印堆栈信息的源代码发布到prod中,进行监测。

2.1 mqcloud源代码分析

在这里插入图片描述
handleAlarmMessage方法是告警相关逻辑封装,对于传入的clusterStatList进行解析,不为空则触发告警通知。

在这里插入图片描述
mqAdmin.getNameServerConfig(Arrays.asList(addr));是调用NameServer获取配置信息,对应接口code码RequestCode.GET_NAMESRV_CONFIG。

2.2 NameServer源码分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上述的逻辑,配置信息在NameServer启动时初始化好了,所以不存在Server端代码处理过长原因。

2.3 NameServer源码分析2(源码出错概率太低)

每个NameServer的方法都用了锁,会由于锁竞争导致的资源等待吗?(错误是偶发性的,故不需要考虑死锁情况),那我们继续来排查ReentrantReadWriteLock对象的使用吧。
在这里插入图片描述
相关的代码有点多,这里就做下简单的汇总:

NameServer核心逻辑ReentrantReadWriteLock对应方法逻辑排查;每一个方法都会使用读写锁的逻辑:
1)启动时初始化调用方法:registerConfig(writeLock)、setStorePathFromConfig(writeLock)、
2)UPDATE_NAMESRV_CONFIG入口: update(writeLock)->persist(readLock)->getAllConfigsInternal(readLock)->getStorePath(readLock)
3)GET_NAMESRV_CONFIG入口:getAllConfigsFormatString(readLock)

源代码未发现明显漏洞,进一步搜索mqcloud代码的引用,并未发现UPDATE_NAMESRV_CONFIG接口的使用,源代码挺健壮的,至少调用链路不长。

2.4 大流量分析

由于是偶发性问题,很难监测网络情况,目前简单实用netstat、mtr等工具监测。

1) NameServer服务Netty服务端排查,SelectorThreads默认3(worker)和WorkerThreads默认8(业务IO线程池),足够响应客户端的请求数、SO_SNDBUF与SO_RCVBUF都是65536;

2)mqcloud服务Netty客户端排查,相应配置都配套,对应ExecutorGroup默认4(业务IO线程池),足够客户端使用;

3)netstat检测网络数据包大小,双方服务的Recv-Q与Send-Q大约400左右,排除大数据包问题或缓冲区被占满情况;

其中一台NameServer对应的客户端发送情况,与代码1、2对应;
在这里插入图片描述

3、堆栈分析

线上的问题的定位,堆栈信息是一个很重要的日志记录(4月份的版本没有打印详细堆栈,本次新增),接下来我们进一步来分析下。

3.1 wait response on the channel

告警信息:ns:10.16.30.79:9876;Exception: wait response on the channel <10.16.30.79:9876> timeout, 5000(ms) |
在这里插入图片描述
堆栈信息最终只有到invokeSyncImpl,因为网络层相关的交互其技术框架是无法解决的,比如数据包不可达、网络开小差、服务端接收到但它还在处理中,那我们如何排查呢?既然这样,那我们就直接找寻对应直接在NameServer处理并响应回来的日志即可,通过RocketMQ源码及堆栈,可以定位到:send request to failed异常;

wait response on the channel,最终在客户端会定义为RemotingTimeoutException异常,无论服务端是什么情况,只要客户端没有收到回执且到了超时时间,就强制抛出Timeout类异常,源码如下。
在这里插入图片描述
在这里插入图片描述

3.2 connect to failed

在这里插入图片描述
对应源码它在获取channel时出现问题了,没有成功获取到channel,有两种可能原因:1)获取到的channel后被客户端触发了关闭机制导致channel不是actice状态,2)没有成功创建出channel。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

3.3 send request to failed

ns:..30.74:9876;Exception: send request to <..30.74:9876> failed | |
在这里插入图片描述
在这里插入图片描述
直接定位MQ源代码报错位置,最终可以看到cause异常捕获后throw出来,那我们可以执行去定位堆栈日志。
在这里插入图片描述
终于看到了server的异常代码块了,那接下来跟踪下netty源代码,看看该异常是如何产生的。

由于前面RocketMQ的源码发送消息调用的是channel.writeAndFlush,这里直接在write就报错了。
在这里插入图片描述

在这里插入图片描述

异常终于对上了,引发抛出异常的条件是outboundBuffer = null,继续看一下源码:
在这里插入图片描述
channel关闭时触发、或者flush0时候触发。
在这里插入图片描述
管道被关闭时触发。

基于以上信息,我们可以推出结论:此问题的原因是客户端的channel被关闭了,接下来再回到RocketMQ的客户端源代码,看看其channel关闭的原理。

4、channel关闭分析

4.1 mqcloud引用的RocketMQ的Netty客户端实现分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分析下以下4个关闭条件

1)disconnect事件触发条件:java原生NIO SocketChannel不存在,调用Netty NioSocketChannel的disconnect(ChannelPromise promise) 时,会自动转换成close操作,这里可能性很多,一般是网络层与操作系统层触发。

https://blog.csdn.net/weixin_43257196/article/details/104928779

2)close事件触发条件:关闭操作,可能是客户端/服务端主动关闭,也可能是异常关闭。

https://blog.csdn.net/weixin_43257196/article/details/104865942

3)userEventTriggered事件触发条件:心跳监听关闭,文字心跳探测时间为120s;

4)exceptionCaught事件触发条件:业务发现异常,自动捕获;

拔网线的场景:只要足够快,channel还是可以使用,在插拔的区间,不能动channel对象、也不要主动去关闭channel,当netty的SO_KEEPALIVE参数开启后,tcp底层有75s探测的机制,这一块会触发userEventTriggered事件进行关闭。

基于以上内容分析,很有可能是网络抖动或网络状态不佳导致,目前QA环境对应的服务器也出现了网络问题,生产的网络情况已转交给运维进行监测中。

在这里插入图片描述
QA环境对应的机器图解:运维针对某个网络的监测图表:(其实运维搞的这一套没有用)

1、netty连接超时(办公网络ping ..17.211、baidu.com)、

2、阿里云连接netty超时(其他外网ping .…17.211)、

3、netty端口延迟(办公网络ping .…108.72、 .…17.211、baidu.com)

4、netty阿里云网络延迟(其他外网ping .…108.72、 .…17.211、ali_baidu.com)、

5、整改措施

基于以上分析及运维给出的一些参考指标,而且网络这一块又是老大难的问题,那么可以重设计与实现方向绕过去,需求实现如下:

结合mqcloud更新NameServer配置信息的逻辑,将原逻辑修改为:接入业务重试逻辑,一共调用三次还失败,则进行NameServer告警。

发布后正常,在以下两个时间点触发了重试机制,日志如下:
在这里插入图片描述
根据日志可以看到同一时间节点只有一次错误日志打印,说明重试一次就已经成功访问NameServer。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/367592.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Catalan数

文章目录 Catalan数Leecode96 不同的二叉搜索树题目描述解题思路代码 Leecode22 括号生成题目描述代码 Catalan数 Catalan数是一种组合数学的计数方法&#xff0c;常用于解决一些计数问题&#xff0c;例如括号匹配问题、二叉树的节点问题等。Catalan数的计算公式如下&#xff1…

20240203在Ubuntu20.04.6下配置stable-diffusion-webui.git

20240203在Ubuntu20.04.6下配置stable-diffusion-webui.git 2024/2/3 11:55 【结论&#xff1a;在Ubuntu20.04.6下&#xff0c;生成512x512分辨率的图像&#xff0c;大概需要11秒钟&#xff01;】 前提条件&#xff0c;可以通过技术手段上外网&#xff01;^_首先你要有一张NVID…

servlet会话API

servlet会话API 您可以使用servlet会话API中定义的类和接口来创建和管理用户会话。servlet会话API提供的用于创建和管理用户会话的各种接口有javax.servlet.http.HttpSession、javax.servlet.httpSessionListener和javax.servlet.http.HttpSessionBindingListener和javax.serv…

python爬虫4

#1.练习 # &#xff08;1&#xff09; 获取网页的源码 # &#xff08;2&#xff09; 解析 解析的服务器响应的文件 etree.HTML # (3) 打印 import urllib.request urlhttps://www.baidu.com/ headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit…

Dockerfile构建Nginx访问说明

Dockerfile使用情况 20210903 Dockerfile ,Nginx 参考地址&#xff1a;https://yeasy.gitbook.io/docker_practice/image/build 编写简单Dockerfile 在一个空白目录中&#xff0c;建立一个文本文件&#xff0c;并命名为 Dockerfile&#xff1a; $ mkdir mynginx $ cd myngin…

Swift 入门之自定义类型的模式匹配(Pattern Matching)

概览 小伙伴们都知道 Swift 是一门简洁、类型安全、极富表现力以及“性感迷人”的编程语言。 和大多数语言一样&#xff0c;在 Swift 中也有一些隐藏着的、不为人知的宝藏特性。利用它们我们可以极大增加撸码的愉悦和成就感。 其中&#xff0c;模式匹配&#xff08;Pattern …

【第二十二课】最短路:bellman_ford / spfa算法 (acwing-851 / acwing-853 / c++代码)

目录 前言 acwing-853 bellman_ford算法的思想 代码如下 一些解释 acwing-851 spfa算法思想 代码如下 一些解释 前言 由于权重可以表示不同的度量&#xff0c;例如距离、时间、费用等&#xff0c;具体取决于问题的背景&#xff0c;因此会存在一些权值为负数的题目。…

springboot并mybatis入门启动

pom.xml,需要留意jdk的版本&#xff08;11&#xff09;和springboot版本要匹配&#xff08;2.7.4&#xff09;&#xff0c;然后还要注意mybatis启动l类的版本&#xff08;2.2.2&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xm…

Visual Studio 2022 查看类关系图

这里写自定义目录标题 右键要查看的项目 -“查看”-“查看类图”效果展示&#xff1a; 原文地址 www.cnblogs.com 步骤1&#xff1a;勾选扩展开发 步骤2: 勾选类设计器 右键要查看的项目 -“查看”-“查看类图” 效果展示&#xff1a;

【Uni-App】运行微信小程序时报错routeDone with a webviewId 2 that is not the current page

使用HBuilderX开发微信小程序&#xff0c;运行项目的时有可能会出现routeDone with a webviewId 1 that is not the current page的报错&#xff0c;但不影响运行。如果强迫症介意的话&#xff0c;可以考下面的方法进行修复。 产生原因 由于微信开发者工具的调试基础库处于灰度…

[python]基于Ultra-Fast-Lane-Detection-v2车道线实时检测onnx部署

【论文地址】 https://arxiv.org/pdf/2206.07389.pdf 【框架地址】 https://github.com/cfzd/Ultra-Fast-Lane-Detection-v2 【框架介绍】 Ultra-Fast-Lane-Detection-v2&#xff08;UFL-D-v2&#xff09;算法是一种高效的车道线检测算法&#xff0c;它旨在快速准确地识别…

常见关系型数据库产品介绍

更新晚了&#xff0c;不好意思啦&#xff01;继关系型数据库的介绍与历史今天主要和大家分享关系型数据库有哪些产品以及简单的背景介绍。这篇文章介意宝宝们听着舒缓的音乐静静享受。 关系型数据库的产品有很多&#xff0c;下面和大家分享一些比较有名的、使用比较广泛的关系…

HP惠普暗影精灵8P笔记本OMEN Gaming Laptop 16-n0076AX原厂Win11系统镜像恢复出厂预装OEM系统

原装Windows11系统安装包&#xff0c;适用型号(HP暗影8plus笔记本电脑)&#xff1a; 16-n0000AX、16-n0001AX、16-n0002AX、16-n0003AX、16-n0004AX、16-n0005AX 16-n0016AX、16-n0058AX、16-n0059AX、16-n0076AX、16-n0078AX等 链接&#xff1a;https://pan.baidu.com/s/1G…

Javaweb之SpringBootWeb案例之yml配置文件的详细解析

4.2 yml配置文件 前面我们一直使用springboot项目创建完毕后自带的application.properties进行属性的配置&#xff0c;那其实呢&#xff0c;在springboot项目当中是支持多种配置方式的&#xff0c;除了支持properties配置文件以外&#xff0c;还支持另外一种类型的配置文件&am…

HTMLCSS JavaScript 基础

HTML复杂建立骨架。 CSS复杂装修。 JS负责定义行为和交互。 示例功能&#xff0c;点击按钮&#xff0c;数量增加&#xff0c;图片交互显示。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"…

HiSilicon352 android9.0 开机视频调试分析

一&#xff0c;开机视频概念 开机广告是在系统开机后实现播放视频功能。 海思Android解决方案在原生Android基础上&#xff0c;增加了开机视频模块&#xff0c;可在开机过程中播放视频文件&#xff0c;使用户更好的体验系统开机过程。 二&#xff0c;模块结构 1. 海思自研开机…

操作系统基础:内存管理概述【下】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 &#x1f304;1 两级页表&#x1f3d9;️1.1 知识总览&#x1f3d9;️1.2 单极页表存在的问题&#x1f682;1.2.1 假设&#x1f682;1.2.2 结论 &#x1f3d9;️1.3 对第一…

Android之命令行烧写OTA镜像(一百八十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

接上回如何在App Store和Google Play 上获得曝光度

ASO不仅仅是关键词方面的优化&#xff0c;还有很多其他方面的点要注意。 App被评级的次数与其在搜索结果中的排名直接相关&#xff0c;所以要求用户对应用程序进行评分来积极提高评分非常重要&#xff0c;并且这个数字每天都在持续增长。ASO做评论可以帮助覆盖掉负面的评论&am…

带你了解JAVA中的AQS介绍(AbstractQueuedSynchronizer)

一、AQS 介绍 AQS的全称为&#xff08;AbstractQueuedSynchronizer&#xff09;&#xff0c;这个类在java.util.concurrent.locks包下面。 AQS是一个用来构建锁和同步器的框架&#xff0c;使用AQS能简单且高效地构造出应用广泛的大量的同步器&#xff0c;比如我们提到的Reen…