RocketMQ集群压测实战一:扩展JMeter

3 篇文章 0 订阅
2 篇文章 1 订阅

测试工具:最新版JMeter 3.1

RocketMQ:1m单点或2m-2s-async集群      

   版本apache-rocketmq 4.0.0-incubating(参考 点击打开链接

JDK:Java7+

纯粹生产者TPS压测

public class Producter extends AbstractJavaSamplerClient{

    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {

        SampleResult sr = new SampleResult();
        sr.setSampleLabel("RocketMQ测试");
        try {
            sr.sampleStart();
            DefaultMQProducer producer = new DefaultMQProducer(MixUtil.createGroupName("ProducerGroupName_"));
            producer.setNamesrvAddr(MixUtil.NAME_SRV_ADDR);
            producer.setInstanceName("Producer");
            producer.setVipChannelEnabled(false);

            producer.start();// once
            int times = 1000;
            for(int i=0;i<times;++i){
                try {
                    {
                        Message msg = new Message("WangXiaoRuiTopic", "TagA", "WangXiaoRui", ("王小瑞,花名誓嘉,阿里巴巴中间件消息团队负责人,具有丰富的高可用,高可靠分布式系统构建经验,主导了阿里巴巴多次双十一消息引擎的改进优化项目,拥有多项分布式领域的专利。Apache RocketMQ联合创始人").getBytes());
                        SendResult sendResult = producer.send(msg);
                        if(sendResult ==null || sendResult.getSendStatus() != SendStatus.SEND_OK){
                            System.err.println(sendResult);
                        }
                    }

                    {
                        Message msg = new Message("FengJiaTopic", "TagB", "FengJia", ("冯嘉,花名鼬神,阿里巴巴中间件架构师,具有丰富的分布式软件架构、高并发网站设计、性能调优经验,拥有多项分布式领域的专利。开源爱好者,专注分布式、大数据领域,关注Hbase/Hadoop/Spark/Flink等大数据技术栈。目前负责阿里消息中间件生态输出、云上商业化,Apache RocketMQ联合创始人。联系方式: vongosling@apache.org").getBytes());
                        SendResult sendResult = producer.send(msg);
                        if(sendResult ==null || sendResult.getSendStatus() != SendStatus.SEND_OK){
                            System.err.println(sendResult);
                        }
                    }

                    {
                        Message msg = new Message("RocketMQHostTopic", "TagC", "RocketMQHist", ("第三代,以拉模式为主,兼有推模式的高性能、低延迟消息引擎RocketMQ,在二代功能特性的基础上,为电商金融领域添加了可靠重试、基于文件存储的分布式事务等特性,并做了大量优化。从2012年开始,经历了历次双11核心交易链路检验。目前已经捐赠给Apache基金会。时至今日,RocketMQ很好的服务了阿里集团大大小小上千个应用,在双11当天,更有不可思议的万亿级消息流转,为集团大中台的稳定发挥了举足轻重的作用").getBytes());
                        SendResult sendResult = producer.send(msg);
                        if(sendResult ==null || sendResult.getSendStatus() != SendStatus.SEND_OK){
                            System.err.println(sendResult);
                        }
                    }

                }catch (Exception e){
                    e.printStackTrace();;
                }
            }

            producer.shutdown();

            sr.setResponseData("success","utf-8");
            sr.setDataType(SampleResult.TEXT);
            sr.setSuccessful(true);
        }catch(Exception e){
            sr.setSuccessful(false);
            sr.setResponseData(MixUtil.getStackTrace(e),"utf-8");
            e.printStackTrace();
        }
        finally {

            sr.sampleEnd();
        }


        return sr;
    }
...

没有纯粹的消费者TPS压测例子。。生产和消费混合TPS压测

package cn.treebear.rocketmq.tester;

import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * Created by zhujl on 2017/4/13.
 */
public class Consumer extends AbstractJavaSamplerClient {

    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {

        SampleResult sr = new SampleResult();
        sr.setSampleLabel("RocketMQ消费者测试");
        try {
            sr.sampleStart();
            DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(MixUtil.createGroupName("ConsumerGroupname_"));
            consumer.setNamesrvAddr(MixUtil.NAME_SRV_ADDR);
            consumer.setInstanceName("Consumer");

            consumer.subscribe("WangXiaoRuiTopic", "TagA || TagC || TagD");

            consumer.subscribe("FengJiaTopic", "*");

            consumer.registerMessageListener(new OutMessageListener());


            consumer.start();
            System.out.println("Consumer Started.");

            TimeUnit.MILLISECONDS.sleep(10 * 1000);

            consumer.shutdown();

            sr.setResponseData("success","utf-8");
            sr.setDataType(SampleResult.TEXT);
            sr.setSuccessful(true);
        }catch (Exception e){
            sr.setSuccessful(false);
            sr.setResponseData(MixUtil.getStackTrace(e),"utf-8");
            e.printStackTrace();
        }finally {
            sr.sampleEnd();
        }

        return sr;
    }
}

package cn.treebear.rocketmq.tester;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

/**
 * Created by zhujl on 2017/4/13.
 */
public class MixUtil {

    public final static String NAME_SRV_ADDR = "namesrv1:9876;namesrv2:9876";
    public static String getStackTrace(Throwable aThrowable) {
        final Writer result = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(result);
        aThrowable.printStackTrace(printWriter);
        return result.toString();
    }

    public  static String getIpAddr(){
        String ip="";
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
                NetworkInterface intf = en.nextElement();
                String name = intf.getName();
                if (!name.contains("docker") && !name.contains("lo")) {
                    for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                        //获得IP
                        InetAddress inetAddress = enumIpAddr.nextElement();
                        if (!inetAddress.isLoopbackAddress()) {
                            String ipaddress = inetAddress.getHostAddress().toString();
                            if (!ipaddress.contains("::") && !ipaddress.contains("0:0:") && !ipaddress.contains("fe80")) {

                                System.out.println(ipaddress);
                                if (!"127.0.0.1".equals(ip)) {
                                    ip = ipaddress;
                                }
                            }
                        }
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return ip;
    }

    public static final int getProcessID() {
        RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
        System.out.println(runtimeMXBean.getName());
        return Integer.valueOf(runtimeMXBean.getName().split("@")[0])
                .intValue();
    }

    public static String createGroupName(String groupPrefix){
        return groupPrefix +"_" + getIpAddr().replaceAll("\\.","_") + "_"+getProcessID()+"_"+Thread.currentThread().getId();
    }


    public static void main(String[] args){
        System.out.println(MixUtil.createGroupName("ProducerGroupName_"));
    }
}

package cn.treebear.rocketmq.tester;

import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;

import java.util.List;

/**
 * Created by zhujl on 2017/4/17.
 *
 */
public class OutMessageListener implements MessageListenerConcurrently {
    /**
     * 默认msgs里只有一条消息,可以通过设置consumeMessageBatchMaxSize参数来批量接收消息
     */
    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
        System.out.println(Thread.currentThread().getName() + " Receive new Message:" + msgs.size());
        MessageExt msg = msgs.get(0);
        if (msg.getTopic().equals("WangXiaoRuiTopic")) {
            if (msg.getTags() != null && msg.getTags().equals("TagA")) {
                System.out.println("do with TagA,msg:" + msg);
            } else if (msg.getTags() != null && msg.getTags().equals("TagC")) {
                System.out.println("do with TagC,msg:" + msg);
            } else if (msg.getTags() != null && msg.getTags().equals("TagC")) {
                System.out.println("do with TagC,msg:" + msg);
            }
        } else if (msg.getTopic().equals("TopicTest2")) {
            System.out.println(new String(msg.getBody()));
        }
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    }
}

将源码打为jar包与其它依赖的包一起拷贝到jmeter扩展目录


新建执行计划,添加java请求节点,选择生产者或者消费者


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值