成功的脚本压测图:
一、MQ性能压测脚本准备
Rocket官方源码提供的有代码——benchmark,详见下图。mq官方下载
源码见图:
打包项目为jar包
此处做个打包讲解吧。最推荐方式:
<build>
<!-- 打包后的名字 -->
<finalName>benchmark-1.0-SNAPSHOT-consumer</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 指定程序入口 (需要注意的地方)-->
<mainClass>org.apache.rocketmq.Consumer</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<!-- </pluginManagement>-->
</build>
其他的如点击或自行百度吧,不过都没这个简单哈。有工具用就要学会发挥其作用,不要一味地追求没效率的学习。
接下来就是在linux虚机中编写脚本运行这个代码了。
下方的脚本编写比较简单,重点学习一下 java -jar 和java -cp的不同。前半部分都是jvm调优,启动参数,重点就最后一行。
期间遇见的问题:
问题一:找不到主类
解决方案和知识点:
if [ -z "$JAVA_HOME" ]; then
JAVA="java"
else
JAVA="$JAVA_HOME/bin/java"
fi
# Memory options
if [ -z "$ROCKETMQ_HEAP_OPTS" ]; then
ROCKETMQ_HEAP_OPTS="-Xmx256M"
fi
# JVM performance options
if [ -z "$ROCKETMQ_JVM_PERFORMANCE_OPTS" ]; then
ROCKETMQ_JVM_PERFORMANCE_OPTS="-server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+DisableExplicitGC -Djava.awt.headless=true"
fi
exec $JAVA $ROCKETMQ_HEAP_OPTS $ROCKETMQ_JVM_PERFORMANCE_OPTS -jar benchmark-1.0-SNAPSHOT.jar "$@"
exec java -jar benchmark-1.0-SNAPSHOT.jar "$@"
和下方的做下区别。
exec java -cp benchmark-1.0-SNAPSHOT.jar org.apache.rocketmq.Producer "$@"
核心区别:
如果再遇见,Error: Could not find or load main class *** 那就看看包名正确否,路径是相对路径还是绝对路径,都不行自行百度解决吧,或者就换方式吧直接使用java -jar 不使用java -cp。
参考链接: https://blog.csdn.net/weixin_38653290/article/details/84647019
https://blog.csdn.net/abcdu1/article/details/86693800
问题二:脚本执行失败**
解决方案:
参考链接:
https://blog.csdn.net/u013948858/article/details/79637851
到此处即可使用命令行进行Rocketmq的生产和消费了。
找到安装包进入bin目录:
生产消息正常,使用的是代码中默认的topic:BenchmarkTest -n 集群地址ip:端口
问题三
此处新问题出现,消费不到数据。均使用的是默认消费组和默认topic
尝试解决方案:
-
命令行明确指定消费者组,不行,查看是否建立成功?结果成功了;
-
新建新的消费者组和Topic,再次执行消费,还是老问题。
新建消费者组查看Topic列表
-
查看消费组情况:
-
没有路由信息,问题明天接着跟踪。两个方向:
一、在启动mqbroker的时候需要指定 autoCreateTopicEnable=true 验证否,但是还是要根据具体问题分析的。
二、客户端版本和服务器版本不一致,经验证否。
三、查看官方代码,没有路由信息,外加消费不到数据,那肯定是nameserver的事情了。但是生产没有问题,说明nameserver正常啊,那就是消费脚本问题了。本人使用的是mq 4.5.0源码中的消费代码,你会发现消费代码中并没有设置nameserver地址。尝试修改:
报错信息
4.7.1版本官方已经修复,点击查看4.7.1消费代码
此时自己建立的消费者和topic可以了,但是默认的benchmark的还是不行。
经查阅,消费时想使用默认的消费者组、Topic(BenchmarkTest),请设置(上图中p参数会默认为消费者组名称加后缀,如果是自己建立的消费者组请加参数 -p false):
以下内容涉及MQ压测命令或者排查问题的其他命令:
使用默认消费者消费消息需要加-p false
查看具体消费组消费的topic、消息位移、消费位点、消费客户端ip 、消息积压 Diff、最后消费时间
生产发送消息
设置队列数,注意记得同时设置
查看nameserver连接的消费者情况,或者某消费者的具体情况
查看某topic的状态
创建更新Topic
查看结果
发送消息
压测脚本的返回信息字段解析
生产者返回字段信息
消费者返回字段信息解析
消息堆积情况
插入点容器知识
查看容器的指标:
docker images 查看pod的使用的镜像,登录节点部署所在的主机查找
docker stats 镜像id
![在这里插入图片描述](https://img-blog.csdnimg.cn/8c1b072ea93f41febdc332fa84e43a20.png
容器指标查看完整命令
压测方案参考文章
总结做的不错 差一点没考虑,压测脚本会不会是其瓶颈。
压测时候的脚本默认值请参考
下方的可以选择不看,这些都是排查问题时候见到的,简单记录下。
这个可以借鉴下,此处改的是idea中的配置,想想消费的时候是不是也要配置下nameserver,解决问题请分析问题最终的出处,根据原理一步一步排查,终究会解决的。
命令行创建Topic