前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何对消息队列做性能测试

如何对消息队列做性能测试

作者头像
FunTester
发布2019-07-27 18:42:39
9400
发布2019-07-27 18:42:39
举报
文章被收录于专栏:FunTester

本人在负责服务压测的实践中,遇到了一个需求,就是对消息队列的dubbo接口性能进行压测,主要分两类:一类是往队列里面添加,一类是从队列中取值(等同删除)。是一个server的两个不同方法。同组其他人用的jmeter进行的dubbo接口压测。

队列的添加规则比较简单,主要有一个标志msg,由事件类型+用户标识符+消息体构成。做此类此类测试的时候遇到的问题就是如果构建消息体,每次都构建不同的消息体,这里我才用了纳秒+随机数的方式,后来发现直接用纳秒就行。(这里相信jmeter也应该有响应的方法)

在添加队列的测试不太清楚jmeter如何实现,因为他们直接放弃掉了,我才用的方案是,先构建足够多数量的消息,然后将消息数据拿出来放到一个线程安全的集合中,多线程去拿,使用的是java的LinkedBlockingQueue<String>消息队列。没做完一次测试,重置一次测试数据,防止中途有失败的情况。

代码语言:javascript
复制
public int createQ() {        String absolutePath = new File("").getAbsolutePath();        List<String> strings = WriteRead.readTxtFileByLine(absolutePath + "/dubbo");        new Concurrent(new ThreadBase(SourceCode.changeStringToInt(strings.get(0))) {            @Override            protected void before() {
            }
            @Override            protected void doing() throws Exception {                CreateQueueRequest createQueueRequest = new CreateQueueRequest();                createQueueRequest.setReqId(TraceKeyHolder.getTraceKey());                createQueueRequest.setDelayTime(System.currentTimeMillis() + 3600 * 1000);                String msg = "wait_for_publish:8888" + "@" + System.nanoTime() + PublishType.ZUOYE;                createQueueRequest.setMsg(msg);                createQueueRequest.setTaskTypeEnum(TaskTypeEnum.PUBLISH_PROMU);                createQueueRequest.setTtl(0L);                CommonResponse<CreateQueueResultVo> queue = commonDelayQueueService.createQueue(createQueueRequest);                logger.info("createQueue0  {}", JsonUtil.obj2Json(queue));            }
            @Override            protected void after() {
            }        }, SourceCode.changeStringToInt(strings.get(1))).start();        return 0;    }

删除队列:

代码语言:javascript
复制
public int deleteQ() throws InterruptedException {        if (msgs.size() == 0) {            logger.info("队列为空了");            msgs = addmsg();        }        String absolutePath = new File("").getAbsolutePath();        List<String> strings = WriteRead.readTxtFileByLine(absolutePath + "/dubbo");
        new Concurrent(new ThreadBase(SourceCode.changeStringToInt(strings.get(0))) {            @Override            protected void before() {
            }
            @Override            protected void doing() throws Exception {                String msg = msgs.poll(100, TimeUnit.MILLISECONDS);                logger.info("msg:{}", msg);                DeleteQueueRequest deleteQueueRequest0 = new DeleteQueueRequest();                deleteQueueRequest0.setMsg(msg);                deleteQueueRequest0.setTaskTypeEnum(TaskTypeEnum.PUBLISH_PROMU);                CommonResponse<String> queue3 = commonDelayQueueService.deleteQueue(deleteQueueRequest0);                logger.info("deleteQueue2 {}", JsonUtil.obj2Json(queue3));            }
            @Override            protected void after() {
            }        }, SourceCode.changeStringToInt(strings.get(1))).start();
        return 0;    }

其中msgs的设置如下:

代码语言:javascript
复制
public static LinkedBlockingQueue<String> msgs = addmsg();

    public static LinkedBlockingQueue<String> addmsg() {        String absolutePath = new File("").getAbsolutePath();        List<String> strings = WriteRead.readTxtFileByLine(absolutePath + "/queue");        LinkedBlockingQueue<String> ss = new LinkedBlockingQueue<>();        ss.addAll(strings);        logger.info("重新读取队列值");        return ss;    }
  • 这里会有一个问题:在不断测试过程中,addmsg方法可能在测试过程中被执行。

因为我在做测试的时候,数据量足够大,所以没有做处理,如果数据量不足以支撑很多次测试,可以采用启动测试前把msgs进行初始化,或者在before()方法里面为每一个线程进行数据初始化操作。

点击阅读原文,欢迎一起交流

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 CMQ 版
消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档