RocketMQ消息堆积判断

2024-08-28 00:08
文章标签 判断 消息 rocketmq 堆积

本文主要是介绍RocketMQ消息堆积判断,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一 机器部署

1、机器组成

7台机器,均为16G内存  

每台服务器均有4个CPU,2核

 

2、运行环境配置

3、刷盘方式

每台机器master机器均采用异步刷盘方式

 

 

 

 

二 性能评测

1、评测目的

   测试rocketmq是否存在消息堆积场景。

  

2、评测指标

    producer发送消息的maxOffset与consumer消费消息的currOffset的差异值

    给定的常量消息堆积数值。

   

3、评测逻辑

  若消息offset的差异值 大于 常量堆积数值,则认为存在消息堆积的情况。

    反之则不存在消息堆积。

  

  

4、评测过程

       (1)producer端向topic名称为“orderTopicTest”的队列发送海量消息,定为40000条。

    (2)consumer端订阅特定名称的topic,并进行消费。每次消费消息,记录当前消息的Offset;并根据“MAX_OFFSET”关键字,从当前消息对象获取消息最大偏移量的属性值,然后计算偏移量MAX_OFFSET与offset的差异值。关键代码如下:

 

(3)发送消息,记录发送的消息及其相关日志。

      如果消息偏移量offset的差异值 大于 给定的消息堆积个数值,则记录日志,说明存在消息堆积的情况。反之则不存在消息堆积。产生的日志如下

 

 

 

   (4)消息堆积处理

    从日志看出,因producer端先运行了好一会儿,已经产生了741个消息挤压;

    随着consumer消费服务开启,消息一边产生,一边消费,整体来说消息消费的速率高于消息产生的速率,所以消息offset的差异值在不断的减少,故第二个截图的情况存在:消息offset的差异值小于阈值100,所以存在正常消费与消息堆积的混合情况。

    consumer继续消费消息,producer产生消息的速率跟不上consumer的消费速率,故第三图就已经是正常消息消费了,即此时的消息堆积的那一部分消息已被消费。

   

    (5)注意事项

    rocketmq官网文档指出,集群在有Slave情况下,Master一旦发现Consumer访问堆积在磁盘的数据时,访问堆积在磁盘的数据时,会向consumer下达一个指令,命令consumer从slave拉取数据,这样使得正常发消息的consumer与正常消费消息的consumer都不会收到影响。

   此种情况前提:

    A)集群存在salve机器

    B)consumer存在消息堆积

    C)consumer因某种原因访问磁盘数据(而非访问pageCache等内存数据)

    这种情况的场景要求苛刻,需要在高并发的场景下才可能出现;此外,生产环境的集群配置,出现消息堆积的情况,还有可能是受到磁盘大小、网络因素等等原因,本次测试并未深入到此场景,留待后续进一步测试。

 

 

二 评测结果

     1、消息堆积是一个相对值,针对consumer消费消息,某个topic队列中最大的maxOffset与当前消费消息的currOffset的差异值,大于某个特定的阈值,才会出现消息堆积。

    2、当发送消息高于消息消费的速率,则可能出现消息堆积。

    3、其他条件保存正常水平,存在消息堆积的那一部分消息会随着时间不断减少直至消息被消费。

    4、针对过多的消息堆积,可以选择丢弃不重要的消息,即仅仅记录日志,而不真正消费,以此保证消息的完整性,以此来特殊处理消息的堆积情况。

这篇关于RocketMQ消息堆积判断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113174

相关文章

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

SpringCloud整合MQ实现消息总线服务方式

《SpringCloud整合MQ实现消息总线服务方式》:本文主要介绍SpringCloud整合MQ实现消息总线服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、背景介绍二、方案实践三、升级版总结一、背景介绍每当修改配置文件内容,如果需要客户端也同步更新,

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用