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

来源:互联网 发布:视频无损分割软件 编辑:程序博客网 时间:2024/04/28 02:49

测试工具:最新版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请求节点,选择生产者或者消费者


0 0