rocketmq 4.9.2 DefaultLitePullConsumer 长轮循配置使用与压力测试

测试环境: rocketmq 整合 springboot ,程序是在本地测试 ,mysql 也是本地
rocketmq 环境: linux 8核16g 单机 内存,默认启动配置 mysql :本机
jmeter 计划为3000线程线*300=90万条数据,单表保存,字段100个左右,基本为字符串.(本机最终测试可稳定在每秒7000线程数)
有图有真相
图一 线程组
在这里插入图片描述

图二 http 请示
${cnt} 配置的是计数器,区分数据,不会全部一毛一样在这里插入图片描述
图三 计数器
在这里插入图片描述
图四 汇总报告
在这里插入图片描述

jmiter 实际运行时间24分钟,无异常.
图五 后台控制台日志
在这里插入图片描述

图五 数据库存储
后台消息队列共运行41分钟无任何异常.,90万条数据全落库,无丢失
在这里插入图片描述

图六 响应时间表
有些时间略长,因为设置了返回同步消息结果,异步或单向消息会快些.
在这里插入图片描述
图七 表格察看结果 响应时间等

在这里插入图片描述

图八 dashboard 仪表盘
在这里插入图片描述
注意配置与使用时的tag 标签要一致

由于新版本消费者 DefaultLitePullConsumer 是新版本推出的功能,而DefaultMQPullConsumer 显示已过时,花了最多时间研究它.
期间也出现过 一些异常 逐一分析原因.
jmeter中 Socket closed 单机测试多线程配置等原因不能过大,上万肯定报这个错误的,后来设到1000 就可以了,本机4000当前配置也会报错,运行次数根据需要来设定.
broker busy 是出现最多的地方,生产者这里报的异常

 SendResult result = rocketMQTemplate.syncSend("TopicTest:TagB", obj);

解决方法:
说明 messageExts.size() 即为一次最大拉取消息数 @1

litePullConsumer.setPullBatchSize(1000);
1.@1 处默认为10条,即使设置为1000 ,我的单个线程最大拉取也只跑到了最高140

修改broker.conf 配置

namesrvAddr=ip:9876
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
brokerIP1=ip
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
//单个线程最大拉取配置,如不修改此配置@1 只能到32条,修改后我的达到140条 图五日志
maxTransferCountOnMessageInMemory=5000
maxTransferBytesOnMessageInMemory = 5000 * 1024
//发送队列等待时间 最好不要大于300毫秒,本就为高并发,设个好几秒还要消息队列没意义了
waitTimeMillsInSendQueue=300
**//下面两项解决了broker busy 生产者的异常**
//发消息线程池数量默认是4 @2
sendMessageThreadPoolNums=128
//拉消息线程池数量默认是32 @#
pullMessageThreadPoolNums=128

现在还没有用于生产环境,即使我大量提前堆积过万条消息,再触发消费者消费,@1也没有发生变化.
如果有朋友有大量提高单次拉取数量的方法可留言

更多原码
pom.xml

        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>4.9.2</version>
        </dependency>

生产者 一般http 请求

idea application.properties

rocketmq.name-server=ip:9876
rocketmq.producer.group=my-producer-group
rocketmq.producer.send-message-timeout=300000
rocketmq.producer.max-message-size=4194304
    public String saveStudent(@RequestBody Student student) {
        try {
            //只传一个对象时
            //JSONObject obj = (JSONObject) JSONObject.toJSON(entity);
            JSONObject obj = new JSONObject();
            obj.put("entity", student);
            // 投递消息到TopicTest主题中
            // 投递消息到主题的tags中,格式为:主题:tags   或者使用Message类设置tags           
            //同步发送
            SendResult result = rocketMQTemplate.syncSend("TopicTest:TagB", obj);
            return result.getSendStatus().name();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "SEND_OK";
    }

消费者 一般http触发

   public void main() throws Exception {
        // 1、创建DefaultLitePullConsumer对象
        DefaultLitePullConsumer litePullConsumer = new DefaultLitePullConsumer("lite_pull_consumer_test");
        litePullConsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        // 2、设置namesrv地址
        litePullConsumer.setNamesrvAddr("ip:9876");
        // 3、订阅消费主题
        litePullConsumer.subscribe("TopicTest", "TagB");
        //一次拉取会变为32
        litePullConsumer.setPullBatchSize(1000);
       // litePullConsumer.setConsumeMessageBatchMaxSize();

        // 4、启动消费对象
        litePullConsumer.start();
        try {
            // 5、循环开始消费消息
            while (running) {
                List<MessageExt> messageExts = litePullConsumer.poll();
                System.out.println("messageExts.size():==========================" + messageExts.size());
                for (MessageExt messageExt : messageExts) {
                    //业务处理代码
                }
            }
        } finally {
            litePullConsumer.shutdown();
        }
    }

非轮循方式 监听消费者使用方法

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.entity.ZDStudent;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import java.util.Date;

@Slf4j
@Service
@RocketMQMessageListener(topic = "TopicTest", consumerGroup = "Student_consumer_group",
        consumeMode = ConsumeMode.CONCURRENTLY, consumeThreadMax = 64, // 指定消费者线程数量
        selectorExpression = "TagD") // 指定tags消费
public class ConsumerStudentController implements RocketMQListener<MessageExt> {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Override
    public void onMessage(MessageExt message) {
        JSONObject obj = (JSONObject) JSON.parse(message.getBody());
        //只传一个对象时
        //OrderEntity entity = JSONObject.toJavaObject(obj, OrderEntity.class);

        //String str = obj.getString("name");
        JSONObject jo = obj.getJSONObject("entity");
        Student student = JSONObject.toJavaObject(jo, Student.class);
        //int result = jdbcTemplate.update....
        
    }
}

-----------------------------------------华丽分割线----------------------------------------------
图九 最终测试版
在这里插入图片描述
一.本测试电脑cpu 为i5 -9400F 六核,(8g内存,影响不大)线程数设置为8000时 cpu达到100%,jmeter就崩掉了,大部分出现请示失败,测试也失败,最后设为7000能稳定跑完测试,所以只要你的电脑配置够高,1万+线程数也不是问题.
上面的@2与@3 处我现在设置的都是256,生产者处再没有报过错,说明服务器rocketmq发送与拉取线程池数足够,不需要再高过此值.
rocketMQTemplate.syncSend(“TopicTest:TagB”, obj);//此处
二 服务器的cpu 基本维持在2%-3%以下,开销很小,有非常大的空间可提升,跟此服务器配置高,没有其它应用也有关系.

ps: 1 本示例中保存语句使用的是单条保存,如果使用jpa 中的saveAll()等批量保存,
用时会更加少,请看本人另一篇博文

https://blog.csdn.net/wfzlm/article/details/121553921

  1. 后将应用布署至服务器测试,数据库也使用后,由于需要vpn连接内网,网速太慢,jmeter 报错频繁,后续可考虑阿里的云服务器测试.
    在这里插入图片描述

引用
DefaultMQPushConsumer 使用示例与注意事项

learn.lianglianglee.com/专栏/RocketMQ 实战与进阶(完)/10 DefaultMQPushConsumer 使用示例与注意事项.md

system busy 和 broker busy 解决方案

https://www.cnblogs.com/enenen/p/10138511.html

控制台登录

https://blog.csdn.net/zhangchaoyang/article/details/122130212

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值