服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 消费者太多!RocketMQ又炸了!

消费者太多!RocketMQ又炸了!

2024-01-24 14:08阿丸笔记 Java教程

1、问题现象 先说明下RocketMQ版本, 4.6.0的老版本了。 线下环境客户端启动会频繁报错响应超时,导致consumer实例化失败,无法启动应用。 图片 2、排查 确认线下环境RocketMQ集群流量、生产消费数量无异常。 集群gc次数不多,但是耗

1、问题现象

先说明下RocketMQ版本, 4.6.0的老版本了。

线下环境客户端启动会频繁报错响应超时,导致consumer实例化失败,无法启动应用。

消费者太多!RocketMQ又炸了!图片

2、排查

确认线下环境RocketMQ集群流量、生产消费数量无异常。

集群gc次数不多,但是耗时高。(原本监控看板异常数据缺失,所以少了前面一段)

消费者太多!RocketMQ又炸了!图片

master节点cpu使用率、load极高。

消费者太多!RocketMQ又炸了!图片

升配,4c8g升级8c32g,扩大jvm内存。

系统指标略有下降,但是客户端异常没有明显改善。

只能进一步排查根因,还得上arthas。

thread -n 3

查看cpu高的线程在做什么。

发现两个异常线程。

1)一个线程在执行AdminBrokerProcessor.queryTopicConsumerByWho()。

消费者太多!RocketMQ又炸了!图片

这个是查询Topic的conusmerGroup信息。

比较奇怪的是,这个请求很频繁,后来发现是控制台应用dashboard有个定时任务,30s查询一次。

这个请求的耗时主要是在数组的遍历处理上,说明内存中的数据非常大。

消费者太多!RocketMQ又炸了!图片

而这个源码中的offsetTable,就是RocketMQ中保存consumerGroup位点信息的对象。它的key是topic@group拼接的。

消费者太多!RocketMQ又炸了!图片

先临时处理,把dashboard应用关闭了,减少请求。但是效果并不明显。

2)另一个线程在执行定时任务ConsumerOffsetManager.persist()。

(线程调用信息忘记截图了)

这个是RocketMQ集群持久化consumerGroup的offset信息的定时任务。

消费者太多!RocketMQ又炸了!图片

会将整个内存对象转化为jsonString写入磁盘文件中。

这个内存对象就是前面提到的offsetTable,就是RocketMQ中保存consumerGroup位点信息的对象。

这里消耗资源多,还是说明我们的内存对象非常大。

因为是线下环境,可靠性要求不高。所以先临时处理,把定时任务默认配置5s改成50s,减少持久化次数。

效果显著,机器cpu、负载都明显改善。

好了,现在问题的矛头都指向了这个offsetTable,那它到底有多大,为什么这么大?

3、定位根因

3.1 直接原因

大对象的定位,一般来说需要dump看看,不过这个对象有点特殊,刚刚也提到了它会被持久化到文件中,所以直接看文件大小和内容就行了。

持久化文件的配置路径,可以看下启动的conf.properties

storePathRootDir=/usr/local/rocketmq/store1
storePathCommitLog=/usr/local/rocketmq/store1/commitlog
storePathConsumerQueue=/usr/local/rocketmq/store1/consumequeue
storePathIndex=/usr/local/rocketmq/store1/index

在/usr/local/rocketmq/store1目录下找到config文件夹的consummerOffset.json文件,44M,amazing~

对一个几十M的对象频繁序列化和持久化,加上内网磁盘比较差,难怪负载如此高。

消费者太多!RocketMQ又炸了!图片

(这里截图是当时应急时备份的文件,新的文件目前是414K)

3.2 根本原因

为什么这个内存对象这么大呢?

查看了下文件内容,是RocketMQ中保存consumerGroup位点信息的对象,它的key是topic@group拼接的。

我们发现大量奇怪的consumerGroup name,跟一个topic联合产生了几千个key。

查看了下内部封装的客户端代码,找到了罪魁祸首。

消费者太多!RocketMQ又炸了!图片

线下环境会根据小环境(比如自己起的测试、单测环境、CI测试环境等)拼接一个独立的consumerGroup name。

在线下,每次CI的测试环境名字会变化,所以导致consumerGroup name数量急剧膨胀。

4、优化

问题找到了,直接的解决方式是删除文件中无用的consumerGroup name,重启broker进行加载。

由于是线下环境,不需要担心位点丢失的问题,同时当客户端请求时会自动创建新的位点信息,所以可以考虑直接删除。

消费者太多!RocketMQ又炸了!图片

先停止broker进程(否则会自动落盘内存数据,创建新的文件),然后重命名相关文件(用于备份回滚),重新启动broker进程,读取空文件加载空对象。

重启后,各个客户端在请求集群时,会自动创建订阅关系和消费位点记录,负载略有升高,然后就恢复到较低的负载水位了。

24h的监控显示,优化效果显著,整个机器负载降低,请求读写耗时也显著降低。

消费者太多!RocketMQ又炸了!图片

注意:保存订阅关系的subscriptionGroup.json也存在同样consumerGroup过多导致膨胀的问题,同样的原因和优化方式。默认订阅关系也是会自动创建的。这里就不展开赘述了。

5、扩展一下

如果类似的问题出在线上怎么办?

事后来看,类似问题是能够提前避免的,主要考虑两个措施:

  • 要做好持久化文件(对应内存对象)大小监控,避免出现内存大对象。如果发现异常增长,必须提前排查处理。
  • 磁盘要足够好,使用SSD是基本要求,避免频繁刷盘导致负载升高。

原文地址:https://mp.weixin.qq.com/s/X1rmlxRyWClZ6YeY-5Tp-A

延伸 · 阅读

精彩推荐
  • Java教程硬核剖析Java ThreadLocal源码(面试官看了直呼内行)

    硬核剖析Java ThreadLocal源码(面试官看了直呼内行)

    ThreadLocal是线程本地变量,就是线程的私有变量,不同线程之间相互隔离,无法共享,相当于每个线程拷贝了一份变量的副本。...

    一灯架构4872022-10-25
  • Java教程Java8新特性Stream流实例详解

    Java8新特性Stream流实例详解

    Stream流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。这篇文章主要介绍了Java8新特性Stream流的相关资料,需要的朋友参考下吧...

    我不是李大侠5692021-01-25
  • Java教程Java数据结构之二叉搜索树详解

    Java数据结构之二叉搜索树详解

    二叉搜索树作为一个经典的数据结构,具有链表的快速插入与删除的特点,同时查询效率也很优秀,所以应用十分广泛。本文将详细讲讲二叉搜索树的原理...

    Carol淋5172023-02-14
  • Java教程Java实现三子棋游戏

    Java实现三子棋游戏

    这篇文章主要为大家详细介绍了Java实现三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    黄佳俊、10302022-11-30
  • Java教程深入浅析MyBatis foreach标签

    深入浅析MyBatis foreach标签

    Mybatis foreach 标签用于循环语句,它很好的支持了数据和 List、set 接口的集合,并对此提供遍历的功能,本文给大家介绍MyBatis foreach标签的相关知识,感兴趣...

    JD强子3722022-01-22
  • Java教程Spring Boot参数校验以及分组校验的使用

    Spring Boot参数校验以及分组校验的使用

    做web开发有一点很烦人就是要对前端输入参数进行校验,基本上每个接口都要对参数进行校验,比如一些非空校验、格式校验等。如果参数比较少的话还是...

    阿里技术7782021-08-11
  • Java教程Java 多线程之间共享数据

    Java 多线程之间共享数据

    这篇文章主要介绍了Java 多线程之间共享数据,围绕Java 多线程之间共享数据展开文章内容线程范围的共享变量、使用Map实现线程范围内数据的共享、Threa...

    冬日毛毛雨4542022-03-03
  • Java教程详解Maven安装教程及是否安装成功

    详解Maven安装教程及是否安装成功

    这篇文章主要介绍了详解Maven安装教程及是否安装成功,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    yyiou5292021-06-24