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