diff --git a/docs/pulsar-design.docx b/docs/pulsar-design.docx
new file mode 100644
index 0000000..f8b9c5a
Binary files /dev/null and b/docs/pulsar-design.docx differ
diff --git a/docs/~$lsar-design.docx b/docs/~$lsar-design.docx
new file mode 100644
index 0000000..9bf24d2
Binary files /dev/null and b/docs/~$lsar-design.docx differ
diff --git a/tools/MQTest/MQTestResult.md b/tools/MQTest/MQTestResult.md
new file mode 100644
index 0000000..623abb5
--- /dev/null
+++ b/tools/MQTest/MQTestResult.md
@@ -0,0 +1,70 @@
+## Test Environment
+
+Five machines with ubuntu 18.04
+
+- CPU: Intel Xeon Gold 6152(22 cores, 44 threads)
+
+- Memory:32G * 4
+
+## Test Result
+
+### RocketMQ
+
+#### 1.one broker
+
+| topicNumber | CPU (%) | TPS Produce | TPS Consume | disk util(%) | delay(ms) |
+| ----------- | ------- | ----------- | ----------- | ------------ | --------- |
+| 0 | 2.11 | 0 | 0 | 0 | 0 |
+| 100 | 625 | 76,245.38 | 76,233.48 | 82.84 | 10 |
+| 1000 | 780 | 73,644.00 | 72,582.00 | 91.75 | 30 |
+| 3000 | 780 | 74,737.85 | 61,315.64 | 93.01 | 101 |
+| 5000 | 801 | 73,919.80 | 52,581.76 | 96.89 | 167 |
+| 6000 | 789 | 71,059.79 | 44,962.30 | 92.72 | 197 |
+| 7000 | 823 | 72,114.44 | 43,316.24 | 93.33 | 221 |
+
+- **Exception occurs when topic number becomes 8000**
+- **The Number of threads used to produce and consume message is 100 and the payload is 1Kb**
+- **Average data over a period of one minute**
+
+#### 2.three brokers
+
+| topicNumber | TPS Producer | TPS Consumer | disk util(%) | delay(ms) |
+| ----------- | :----------- | ------------ | ------------ | ------------- |
+| 100 | 30,985.00 | 30,845.00 | 97.78 | 29 |
+| 1000 | 30,529.19 | 29,950.50 | 99.56 | 93 |
+| 3000 | 30,477.55 | 27,195.28 | 99.92 | 230 |
+| 5000 | 30,477.55 | 27,195.28 | 100 | 339 |
+| 7000 | 30,902.93 | 11,646.71 | 100 | up to 170000 |
+| 8000 | 31,491.40 | 9,426.19 | 99.99 | up to 140000 |
+| 9000 | 31,994.80 | 7,031.48 | 100 | up to 350000 |
+
+- **When the topic number comes to 10000, there is an exception**
+- **The TPS is the average data of three brokers**
+
+
+
+### Pulsar
+
+#### 1. one broker
+
+| topicNumber | TPS Produce | TPS Consume | disk util(%) |
+| ----------- | ----------- | ----------- | ------------ |
+| 4000 | 31977 | 31691 | >=97 |
+| 6000 | 29,553.00 | 28,473.00 | >=97 |
+| 8000 | 29680.9 | 29931.55 | >=97 |
+| 10000 | 0 | 0 | 0 |
+
+#### 2. three brokers
+
+| topicNumber | CPU (%) | TPS Produce(average) | TPS Consume(average) | disk util(%) | Mem(G) |
+| -------------- | ------- | -------------------- | -------------------- | -------------- | ------ |
+| 1000(10*100) | 780 | 64,603.00 | 50,615.29 | >=97 | 22 |
+| 5000(10*500) | 801 | 36134.42 | 32257.58 | >=97 | 38 |
+| 10000(10*1000) | | 31378.69 | 32,078 | >=97 | 46.7 |
+| 10000(20*500) | | 59832.1 | 59,773 | >=97 | 47.1 |
+| 30000(100*300) | | 45,669.31 | 46,779.04 | >=97 | 59.2 |
+
+- **Disks generally maintain a write rate of 89% and a read rate of 9%. Writing occupies most of the IO, which may cause timeout.**
+- **Tps is 0 when topics are created in the early stage, and the time is about 6-8 minutes**
+
+- **Delays are maintained at 100ms-300ms**
diff --git a/tools/MQTest/RocketMQTest/.gitignore b/tools/MQTest/RocketMQTest/.gitignore
new file mode 100644
index 0000000..5eae1a8
--- /dev/null
+++ b/tools/MQTest/RocketMQTest/.gitignore
@@ -0,0 +1,26 @@
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+# Store files for rmq
+docker-rocketmq/rmq/rmq/store/*
\ No newline at end of file
diff --git a/tools/MQTest/RocketMQTest/README.md b/tools/MQTest/RocketMQTest/README.md
new file mode 100644
index 0000000..3b08d0b
--- /dev/null
+++ b/tools/MQTest/RocketMQTest/README.md
@@ -0,0 +1,66 @@
+# RocketMQ Test
+
+## 1. Preparation
+
+Before starting, the following information should be prepared:
+
+- Java 1.8 or above
+- docker-compose 1.24.0 or above
+
+Move to this directory and give scripts execution permission
+```SHELL
+cd ~/RocketMQTest
+chmod +x ./scripts/*.sh
+```
+
+## 2. Dockers for RocketMQ
+Docker files are from:
+
+[github.com/foxiswho/docker-rocketmq](github.com/foxiswho/docker-rocketmq)
+
+- Start one nameserver, one broker and one console with:
+
+```shell
+./scripts/start.sh
+```
+
+- If only need to setup one broker on the server,use:
+```SHELL
+./scripts/start_broker.sh
+```
+
+- Move to the corresponding directory and use the following command to end dockers:
+
+```
+docker-compose down
+```
+
+- Open dashboard in browser:
+
+```
+localhost:8180
+```
+
+
+
+## 3. Producer and Consumer Client
+
+- Firstly, compile and package the target files:
+
+```shell
+./scripts/build.sh
+```
+
+- Run producer client with parameters:
+
+```sh
+./scripts/run_producer.sh $0 $1
+```
+
+- Run consumer client with parameters:
+
+```shell
+./scripts/run_consumer.sh $0 $1
+```
+
+where $0 stands for the thread numbers and $1 stands for the topic numbers.
\ No newline at end of file
diff --git a/tools/MQTest/RocketMQTest/client/pom.xml b/tools/MQTest/RocketMQTest/client/pom.xml
new file mode 100644
index 0000000..ebe36e1
--- /dev/null
+++ b/tools/MQTest/RocketMQTest/client/pom.xml
@@ -0,0 +1,46 @@
+
+
+ 4.0.0
+
+ org.rmq
+ test
+ 0.0.1-SNAPSHOT
+
+ 1.6
+ 1.6
+
+
+
+ org.apache.rocketmq
+ rocketmq-client
+ 4.7.0
+
+
+
+ commons-cli
+ commons-cli
+ 1.4
+
+
+
+
+
+ maven-assembly-plugin
+
+ jar-with-dependencies
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tools/MQTest/RocketMQTest/client/src/main/java/demo/ConsumerRunnable.java b/tools/MQTest/RocketMQTest/client/src/main/java/demo/ConsumerRunnable.java
new file mode 100644
index 0000000..c5736c6
--- /dev/null
+++ b/tools/MQTest/RocketMQTest/client/src/main/java/demo/ConsumerRunnable.java
@@ -0,0 +1,57 @@
+package org.demo;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+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.consumer.ConsumeFromWhere;
+import org.apache.rocketmq.common.message.MessageExt;
+
+import java.util.Arrays;
+
+
+
+public class ConsumerRunnable implements Runnable{
+
+ private DefaultMQPushConsumer consumer = null;
+
+ private String url = null;
+ private String topicName = null;
+ private String tagName = null;
+ private int topicNumber = 0;
+
+ public ConsumerRunnable(String url, String topicName, String tagName, int topicNumber) {
+ this.url = url;
+ this.topicName = topicName;
+ this.tagName = tagName;
+ this.topicNumber = topicNumber;
+ this.consumer = new DefaultMQPushConsumer("consumerGroup-"+topicName);
+ this.consumer.setNamesrvAddr(url);
+
+ }
+
+
+ @Override
+ public void run(){
+ try {
+ for(int i = 0; i < topicNumber; i++){
+ consumer.subscribe(topicName+"-"+Integer.toString(i), tagName);
+ }
+
+ consumer.registerMessageListener(new MessageListenerConcurrently() {
+ @Override
+ public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) {
+ return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
+ }
+ });
+
+ consumer.start();
+ System.out.printf("%s Consumer Started.%n", Thread.currentThread().getName());
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
diff --git a/tools/MQTest/RocketMQTest/client/src/main/java/demo/ConsumerThreadPool.java b/tools/MQTest/RocketMQTest/client/src/main/java/demo/ConsumerThreadPool.java
new file mode 100644
index 0000000..3a0391a
--- /dev/null
+++ b/tools/MQTest/RocketMQTest/client/src/main/java/demo/ConsumerThreadPool.java
@@ -0,0 +1,60 @@
+package org.demo;
+
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import org.apache.commons.cli.*;
+
+
+public class ConsumerThreadPool {
+ private Config config;
+
+ public ConsumerThreadPool(String[] args){
+ this.config = new Config();
+ this.getOptions(args);
+ }
+
+ private void getOptions(String[] args){
+ Options options = new Options();
+ options.addOption("t",true,"topic number");
+ options.addOption("n",true,"thread number");
+ options.addOption("u",true,"url of namesrv");
+
+
+ CommandLineParser parser = new DefaultParser();
+ try{
+ CommandLine cmd = parser.parse(options,args);
+ config.topicNumber = Integer.parseInt(cmd.getOptionValue("t","100"));
+ config.threadNumber = Integer.parseInt(cmd.getOptionValue("n","100"));
+ config.url = cmd.getOptionValue("u","localhost:9876");
+ }catch (ParseException e){
+ e.printStackTrace();
+ System.err.println("-- fail to get options --");
+ HelpFormatter hf = new HelpFormatter();
+ hf.printHelp("Consumer",options,true);
+ }
+
+ }
+ public static void main(String[] args) {
+ ConsumerThreadPool ctp = new ConsumerThreadPool(args);
+ int threadNumber = ctp.config.threadNumber;
+ int topicNumberPerThread = ctp.config.topicNumber/ctp.config.threadNumber;
+ String url = ctp.config.url;
+
+ String topicName = "topic";
+ String tagName = "*";
+
+ ExecutorService pool = Executors.newCachedThreadPool();
+ for (int threadIndex = 0; threadIndex < threadNumber; threadIndex++) {
+ pool.submit(new ConsumerRunnable(url, topicName + Integer.toString(threadIndex), tagName, topicNumberPerThread));
+ }
+ pool.shutdown();
+ }
+
+ private class Config{
+ int topicNumber;
+ int threadNumber;
+ String url;
+ }
+}
+
diff --git a/tools/MQTest/RocketMQTest/client/src/main/java/demo/ProducerRunnable.java b/tools/MQTest/RocketMQTest/client/src/main/java/demo/ProducerRunnable.java
new file mode 100644
index 0000000..14f4520
--- /dev/null
+++ b/tools/MQTest/RocketMQTest/client/src/main/java/demo/ProducerRunnable.java
@@ -0,0 +1,96 @@
+package org.demo;
+
+import org.apache.rocketmq.client.producer.DefaultMQProducer;
+import org.apache.rocketmq.common.message.Message;
+import org.apache.rocketmq.client.producer.SendCallback;
+import org.apache.rocketmq.client.producer.SendResult;
+import org.apache.rocketmq.client.producer.SendStatus;
+
+import javax.swing.*;
+import java.util.Arrays;
+
+public class ProducerRunnable implements Runnable{
+
+ private DefaultMQProducer producer;
+
+ private String url = null;
+ private String topicName = null;
+ private int topicNumber = 0;
+ private int sendType = 0;
+ private int sleepTime = 0;
+ private int size = 0;
+
+ public ProducerRunnable(String url, String topicName, int topicNumber,int sendType,int size,int sleepTime) {
+ this.url = url;
+ this.topicName = topicName;
+ this.topicNumber = topicNumber;
+ this.sendType = sendType;
+ this.sleepTime = sleepTime;
+ this.size = size;
+
+ this.producer = new DefaultMQProducer("producerGroup-"+ topicName);
+ this.producer.setNamesrvAddr(url);
+ }
+
+ private static String createSpecificSizeString(int size){
+ byte[] temp = new byte[size];
+ Arrays.fill(temp, (byte)0);
+ String temp_str = new String(temp);
+ return temp_str;
+ }
+
+ private void sendMessage(Message message,int sendType) throws Exception{
+ switch (sendType) {
+ case 0:
+ producer.send(message);
+ break;
+ case 1:
+ producer.send(message,new SendCallback(){
+ @Override
+ public void onSuccess(SendResult sendResult){}
+
+ @Override
+ public void onException(Throwable e){
+ e.printStackTrace();
+ System.err.println("---fail to send message---");
+ }
+ });
+ break;
+ case 2:
+ producer.sendOneway(message);
+ break;
+ default:
+ System.err.println("---Unsupport send type---");
+ break;
+ }
+ }
+
+ private void startProducer(String topicName) throws Exception {
+ String tempStr = createSpecificSizeString(size);
+ int count = 0;
+ while (true) {
+ for(int i = 0; i < topicNumber; i++){
+ Message message = new Message(topicName+"-"+Integer.toString(i),"TagTest",tempStr.getBytes());
+ sendMessage(message,sendType);
+ count += 1;
+ Thread.sleep(sleepTime);
+ }
+
+ }
+ }
+
+ @Override
+ public void run(){
+ try {
+
+
+ producer.setVipChannelEnabled(false);
+
+ producer.start();
+ System.out.printf("%s Producer Started.%n", Thread.currentThread().getName());
+ startProducer(topicName);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
diff --git a/tools/MQTest/RocketMQTest/client/src/main/java/demo/ProducerThreadPool.java b/tools/MQTest/RocketMQTest/client/src/main/java/demo/ProducerThreadPool.java
new file mode 100644
index 0000000..0905495
--- /dev/null
+++ b/tools/MQTest/RocketMQTest/client/src/main/java/demo/ProducerThreadPool.java
@@ -0,0 +1,70 @@
+package org.demo;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import org.apache.commons.cli.*;
+
+
+
+public class ProducerThreadPool {
+ private Config config;
+
+ public ProducerThreadPool(String[] args){
+ this.config = new Config();
+ this.getOptions(args);
+ }
+
+ private void getOptions(String[] args){
+ Options options = new Options();
+ options.addOption("t",true,"topic number");
+ options.addOption("n",true,"thread number");
+ options.addOption("y",true,"send message type");
+ options.addOption("u",true,"url of namesrv");
+ options.addOption("st",true,"sleep time");
+ options.addOption("sm",true,"size of message");
+
+ CommandLineParser parser = new DefaultParser();
+ try{
+ CommandLine cmd = parser.parse(options,args);
+ config.topicNumber = Integer.parseInt(cmd.getOptionValue("t","100"));
+ config.threadNumber = Integer.parseInt(cmd.getOptionValue("n","100"));
+ config.sendType = Integer.parseInt(cmd.getOptionValue("y","0"));
+ config.url = cmd.getOptionValue("u","localhost:9876");
+ config.sleepTime = Integer.parseInt(cmd.getOptionValue("st","0"));
+ config.messageSize = Integer.parseInt(cmd.getOptionValue("sm","1024"));
+ }catch (ParseException e){
+ e.printStackTrace();
+ System.err.println("--- fail to get options ---");
+ HelpFormatter hf = new HelpFormatter();
+ hf.printHelp("Producer",options,true);
+ }
+
+ }
+
+ public static void main(String[] args) {
+ ProducerThreadPool ptp = new ProducerThreadPool(args);
+ int threadNumber = ptp.config.threadNumber;
+ int topicNumberPerThread = ptp.config.topicNumber/ptp.config.threadNumber;
+ int sendType = ptp.config.sendType;
+ String url = ptp.config.url;
+ int messageSize = ptp.config.messageSize;
+
+ String topicName = "topic";
+ int sleepTime = ptp.config.sleepTime;
+
+ ExecutorService pool = Executors.newCachedThreadPool();
+ for (int threadIndex = 0; threadIndex < threadNumber; threadIndex++) {
+ pool.submit(new ProducerRunnable(url, topicName + Integer.toString(threadIndex),topicNumberPerThread,sendType,messageSize,sleepTime));
+ }
+ pool.shutdown();
+ }
+
+ private class Config{
+ int topicNumber;
+ int threadNumber;
+ int sendType = 0;
+ String url;
+ int sleepTime = 0;
+ int messageSize = 1024;
+ }
+}
diff --git a/tools/MQTest/RocketMQTest/docker-rocketmq/rmq/docker-compose.yml b/tools/MQTest/RocketMQTest/docker-rocketmq/rmq/docker-compose.yml
new file mode 100644
index 0000000..7851db0
--- /dev/null
+++ b/tools/MQTest/RocketMQTest/docker-rocketmq/rmq/docker-compose.yml
@@ -0,0 +1,59 @@
+version: '3.5'
+
+services:
+ rmqnamesrv:
+ image: foxiswho/rocketmq:4.7.0
+# image: registry.cn-hangzhou.aliyuncs.com/foxiswho/rocketmq:4.7.0
+ container_name: rmqnamesrv
+ ports:
+ - 9876:9876
+ volumes:
+ - ./rmqs/logs:/opt/logs
+ - ./rmqs/store:/opt/store
+ environment:
+ JAVA_OPT_EXT: "-Duser.home=/opt -Xms16G -Xmx16G -Xmn8G"
+ command: ["sh","mqnamesrv"]
+ networks:
+ rmq:
+ aliases:
+ - rmqnamesrv
+ rmqbroker:
+ image: foxiswho/rocketmq:4.7.0
+# image: registry.cn-hangzhou.aliyuncs.com/foxiswho/rocketmq:4.7.0
+ container_name: rmqbroker
+ ports:
+ - 10909:10909
+ - 10911:10911
+ volumes:
+ - ./rmq/logs:/opt/logs
+ - ./rmq/store:/opt/store
+ - ./rmq/brokerconf/broker.conf:/etc/rocketmq/broker.conf
+ environment:
+ JAVA_OPT_EXT: "-Duser.home=/opt -Xms16G -Xmx16G -Xmn8G"
+ command: ["sh","mqbroker","-c","/etc/rocketmq/broker.conf","-n","rmqnamesrv:9876","autoCreateTopicEnable=true"]
+ depends_on:
+ - rmqnamesrv
+ networks:
+ rmq:
+ aliases:
+ - rmqbroker
+
+
+ rmqconsole:
+ image: styletang/rocketmq-console-ng
+ container_name: rmqconsole
+ ports:
+ - 8180:8080
+ environment:
+ JAVA_OPTS: "-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false"
+ depends_on:
+ - rmqnamesrv
+ networks:
+ rmq:
+ aliases:
+ - rmqconsole
+
+networks:
+ rmq:
+ name: rmq
+ driver: bridge
diff --git a/tools/MQTest/RocketMQTest/docker-rocketmq/rmq/rmq/brokerconf/broker.conf b/tools/MQTest/RocketMQTest/docker-rocketmq/rmq/rmq/brokerconf/broker.conf
new file mode 100644
index 0000000..192dea0
--- /dev/null
+++ b/tools/MQTest/RocketMQTest/docker-rocketmq/rmq/rmq/brokerconf/broker.conf
@@ -0,0 +1,98 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+#name of broker cluster
+brokerClusterName=DefaultCluster
+
+#name of broker,should be different in defferent brokers
+
+brokerName=broker-a
+
+#0 for Master,>0 for Slave
+brokerId=0
+
+namesrvAddr=$(namesrvHostIp):9876
+
+brokerIP1=$(brokerHostIp)
+
+#role of broker
+#- ASYNC_MASTER
+#- SYNC_MASTER
+#- SLAVE
+brokerRole=ASYNC_MASTER
+
+#- ASYNC_FLUSH
+#- SYNC_FLUSH
+flushDiskType=ASYNC_FLUSH
+
+#try to avoid system busy/broker busy
+transientStorePoolEnable=true
+waitTimeMillsInSendQueue=30000
+
+#sendMessageThreadPoolNums=512
+sendThreadPoolQueueCapacity = 30000
+
+#pullMessageThreadPoolNums=128
+
+
+#automatically create a topic that does not exist on the server,
+#and the number of queues created by default
+defaultTopicQueueNums=4
+autoCreateTopicEnable=true
+
+
+autoCreateSubscriptionGroup=true
+
+
+listenPort=10911
+
+#when to delete files,default 4am
+deleteWhen=04
+
+fileReservedTime=120
+
+#commitLog default size
+mapedFileSizeCommitLog=1073741824
+
+#size of consumeQueue,default 30w
+mapedFileSizeConsumeQueue=300000
+
+#destroyMapedFileIntervalForcibly=120000
+#redeleteHangedFileInterval=120000
+
+#check disk space
+diskMaxUsedSpaceRatio=88
+#store path
+#storePathRootDir=yourPath/store
+#commitLog
+#storePathCommitLog=yourPath/store/commitlog
+#consumeQueue
+#storePathConsumeQueue=yourPath/store/consumequeue
+#Index
+#storePathIndex=yourPath/store/index
+#checkpoint
+#storeCheckpoint=yourPath/store/checkpoint
+#abortFile
+#abortFile=yourPath/store/abort
+
+#maxMessageSize=65536
+
+
+#flushCommitLogLeastPages=4
+#flushConsumeQueueLeastPages=2
+#flushCommitLogThoroughInterval=10000
+#flushConsumeQueueThoroughInterval=60000
+
diff --git a/tools/MQTest/RocketMQTest/docker-rocketmq/rmq/rmq/docker-compose.yml b/tools/MQTest/RocketMQTest/docker-rocketmq/rmq/rmq/docker-compose.yml
new file mode 100644
index 0000000..7a5fb5e
--- /dev/null
+++ b/tools/MQTest/RocketMQTest/docker-rocketmq/rmq/rmq/docker-compose.yml
@@ -0,0 +1,26 @@
+version: '3.5'
+
+services:
+ rmqbroker:
+ image: foxiswho/rocketmq:4.7.0
+# image: registry.cn-hangzhou.aliyuncs.com/foxiswho/rocketmq:4.7.0
+ container_name: rmqbroker
+ ports:
+ - 10909:10909
+ - 10911:10911
+ volumes:
+ - ./logs:/opt/logs
+ - ./store:/opt/store
+ - ./brokerconf/broker.conf:/etc/rocketmq/broker.conf
+ environment:
+ JAVA_OPT_EXT: "-Duser.home=/opt -Xms16G -Xmx16G -Xmn8G"
+ command: ["sh","mqbroker","-c","/etc/rocketmq/broker.conf","-n","$(rmqnamesrvHostIP):9876","autoCreateTopicEnable=true"]
+ networks:
+ rmq:
+ aliases:
+ - rmqbroker
+
+networks:
+ rmq:
+ name: rmq
+ driver: bridge
diff --git a/tools/MQTest/RocketMQTest/script/build.sh b/tools/MQTest/RocketMQTest/script/build.sh
new file mode 100644
index 0000000..cc6b959
--- /dev/null
+++ b/tools/MQTest/RocketMQTest/script/build.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+
+cd ./client
+
+mvn clean compile package
diff --git a/tools/MQTest/RocketMQTest/script/run_consumer.sh b/tools/MQTest/RocketMQTest/script/run_consumer.sh
new file mode 100644
index 0000000..2a9b0c7
--- /dev/null
+++ b/tools/MQTest/RocketMQTest/script/run_consumer.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+
+#$0 for thread numbers,$1 for topic numbers
+java -cp ./client/target/test-0.0.1-SNAPSHOT-jar-with-dependencies.jar org.demo.ConsumerThreadPool -n $0 -t $1
\ No newline at end of file
diff --git a/tools/MQTest/RocketMQTest/script/run_producer.sh b/tools/MQTest/RocketMQTest/script/run_producer.sh
new file mode 100644
index 0000000..1b87930
--- /dev/null
+++ b/tools/MQTest/RocketMQTest/script/run_producer.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+
+#$0 for thread numbers,$1 for topic numbers
+java -cp ./client/target/test-0.0.1-SNAPSHOT-jar-with-dependencies.jar org.demo.ProducerThreadPool -n $0 -t $1
\ No newline at end of file
diff --git a/tools/MQTest/RocketMQTest/script/start.sh b/tools/MQTest/RocketMQTest/script/start.sh
new file mode 100644
index 0000000..ff52b63
--- /dev/null
+++ b/tools/MQTest/RocketMQTest/script/start.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+
+cd ./docker-rocketmq/rmq
+rm -rf ./rmqs/logs
+rm -rf ./rmqs/store
+rm -rf ./rmq/logs
+rm -rf ./rmq/store
+
+mkdir -p ./rmqs/logs
+mkdir -p ./rmqs/store
+mkdir -p ./rmq/logs
+mkdir -p ./rmq/store
+
+chmod -R 777 ./rmqs/logs
+chmod -R 777 ./rmqs/store
+chmod -R 777 ./rmq/logs
+chmod -R 777 ./rmq/store
+
+
+# start dockers
+docker-compose up -d
+
+
+# show dockers of rocketmq
+docker ps |grep rocketmq
\ No newline at end of file
diff --git a/tools/MQTest/RocketMQTest/script/start_broker.sh b/tools/MQTest/RocketMQTest/script/start_broker.sh
new file mode 100644
index 0000000..57fc23d
--- /dev/null
+++ b/tools/MQTest/RocketMQTest/script/start_broker.sh
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+
+cd ./docker-rocketmq/rmq/rmq
+rm -rf ./logs
+rm -rf ./store
+
+
+mkdir -p ./logs
+mkdir -p ./store
+
+
+chmod -R 777 ./logs
+chmod -R 777 ./store
+
+
+# start docker
+docker-compose up -d
+
+
+# show dockers of rocketmq
+docker ps |grep rocketmq
\ No newline at end of file