共创建两个nameserver,两个master-broker,两个slave-broker
安装全在Docker for Windows上完成
master-a的broker.conf配置文件
brokerClusterName=rocketmq-cluster
# broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
# 0 表示Master,>0 表示Slave
brokerId=0
# 多网卡配置,不配置默认为内网,让mq只能内网访问
brokerIP1=x.x.x.x #这个IP设置为安装Docker for Windows机器的IP
# nameServer地址,分号分割
namesrvAddr=nameserver-a:9876;nameserver-b:9876
# 在发送消息时,自动创建服务器不存在的Topic,默认创建的队列数
defaultTopicQueueNums=4
# 是否允许Broker 自动创建Topic, 建议线下开启, 线上关闭
autoCreateTopicEnable=true
# 是否允许Broker 自动创建订阅组, 建议线下开启, 线上关闭
autoCreateSubscriptionGroup=true
# Broker 对外服务的监听端口
listenPort=10921 #改这个端口需要注意docker-compose配置文件中的映射端口
# 删除文件时间点,默认是凌晨4点
#deleteWhen=04
# 文件保留时间,默认是48小时
fileReservedTime=48
# commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
# ConsumeQueue每个文件默认存30w条, 根据业务情况调整
mapedFileSizeConsumeQueue=30000
# destroyMapedFileIntervalForcibly=12000
# redeleteHangedFileInterval=12000
# 检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
# 限制的消息大小
maxMessageSize=65536
# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000
# Broker的角色
# -ASYNC_MASTER 异步复制Master
# -SYNC_MASTER 同步双写Master
# -SLAVE
brokerRole=ASYNC_MASTER
# 刷盘方式
# - ASYNC_FLUSH 异步刷盘
# - SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH
# checkTransactionMessageEnable=false
# 发消息线程池数量
# sendMessageTreadPoolNums=128
# 拉消息线程池数量
# pullMessageTreadPoolNums=128
# lushDiskType=ASYNC_FLUSH
master-b的broker.conf配置文件
brokerClusterName=rocketmq-cluster
# broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
# 0 表示Master,>0 表示Slave
brokerId=0
# 多网卡配置,不配置默认为内网,让mq只能内网访问
brokerIP1=x.x.x.x
# nameServer地址,分号分割
namesrvAddr=nameserver-a:9876;nameserver-b:9876
# 在发送消息时,自动创建服务器不存在的Topic,默认创建的队列数
defaultTopicQueueNums=4
# 是否允许Broker 自动创建Topic, 建议线下开启, 线上关闭
autoCreateTopicEnable=true
# 是否允许Broker 自动创建订阅组, 建议线下开启, 线上关闭
autoCreateSubscriptionGroup=true
# Broker 对外服务的监听端口
listenPort=10931
# 删除文件时间点,默认是凌晨4点
#deleteWhen=04
# 文件保留时间,默认是48小时
fileReservedTime=48
# commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
# ConsumeQueue每个文件默认存30w条, 根据业务情况调整
mapedFileSizeConsumeQueue=30000
# destroyMapedFileIntervalForcibly=12000
# redeleteHangedFileInterval=12000
# 检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
# 限制的消息大小
maxMessageSize=65536
# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000
# Broker的角色
# -ASYNC_MASTER 异步复制Master
# -SYNC_MASTER 同步双写Master
# -SLAVE
brokerRole=ASYNC_MASTER
# 刷盘方式
# - ASYNC_FLUSH 异步刷盘
# - SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH
# checkTransactionMessageEnable=false
# 发消息线程池数量
# sendMessageTreadPoolNums=128
# 拉消息线程池数量
# pullMessageTreadPoolNums=128
# lushDiskType=ASYNC_FLUSH
slave-a的broker.conf配置文件
brokerClusterName=rocketmq-cluster
# broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
# 0 表示Master,>0 表示Slave
brokerId=1
# 多网卡配置,不配置默认为内网,让mq只能内网访问
brokerIP1=x.x.x.x
# nameServer地址,分号分割
namesrvAddr=nameserver-a:9876;nameserver-b:9876
# 在发送消息时,自动创建服务器不存在的Topic,默认创建的队列数
defaultTopicQueueNums=4
# 是否允许Broker 自动创建Topic, 建议线下开启, 线上关闭
autoCreateTopicEnable=true
# 是否允许Broker 自动创建订阅组, 建议线下开启, 线上关闭
autoCreateSubscriptionGroup=true
# Broker 对外服务的监听端口
listenPort=10941
# 删除文件时间点,默认是凌晨4点
#deleteWhen=04
# 文件保留时间,默认是48小时
fileReservedTime=48
# commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
# ConsumeQueue每个文件默认存30w条, 根据业务情况调整
mapedFileSizeConsumeQueue=30000
# destroyMapedFileIntervalForcibly=12000
# redeleteHangedFileInterval=12000
# 检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
# 限制的消息大小
maxMessageSize=65536
# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000
# Broker的角色
# -ASYNC_MASTER 异步复制Master
# -SYNC_MASTER 同步双写Master
# -SLAVE
brokerRole=SLAVE
# 刷盘方式
# - ASYNC_FLUSH 异步刷盘
# - SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH
# checkTransactionMessageEnable=false
# 发消息线程池数量
# sendMessageTreadPoolNums=128
# 拉消息线程池数量
# pullMessageTreadPoolNums=128
# lushDiskType=ASYNC_FLUSH
slave-b的broker.conf配置文件
brokerClusterName=rocketmq-cluster
# broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
# 0 表示Master,>0 表示Slave
brokerId=1
# 多网卡配置,不配置默认为内网,让mq只能内网访问
brokerIP1=x.x.x.x
# nameServer地址,分号分割
namesrvAddr=nameserver-a:9876;nameserver-b:9876
# 在发送消息时,自动创建服务器不存在的Topic,默认创建的队列数
defaultTopicQueueNums=4
# 是否允许Broker 自动创建Topic, 建议线下开启, 线上关闭
autoCreateTopicEnable=true
# 是否允许Broker 自动创建订阅组, 建议线下开启, 线上关闭
autoCreateSubscriptionGroup=true
# Broker 对外服务的监听端口
listenPort=10951
# 删除文件时间点,默认是凌晨4点
#deleteWhen=04
# 文件保留时间,默认是48小时
fileReservedTime=48
# commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
# ConsumeQueue每个文件默认存30w条, 根据业务情况调整
mapedFileSizeConsumeQueue=30000
# destroyMapedFileIntervalForcibly=12000
# redeleteHangedFileInterval=12000
# 检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
# 限制的消息大小
maxMessageSize=65536
# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000
# Broker的角色
# -ASYNC_MASTER 异步复制Master
# -SYNC_MASTER 同步双写Master
# -SLAVE
brokerRole=SLAVE
# 刷盘方式
# - ASYNC_FLUSH 异步刷盘
# - SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH
# checkTransactionMessageEnable=false
# 发消息线程池数量
# sendMessageTreadPoolNums=128
# 拉消息线程池数量
# pullMessageTreadPoolNums=128
# lushDiskType=ASYNC_FLUSH
上面四个配置文件中的brokerIP1都改为自己本地机器的IP
最后docker-compose配置文件docker-compose-rocketmq.yml
version: '3.7'
services:
nameserver-a:
image: apache/rocketmq:4.9.2
container_name: nameserver-a
ports:
- 9877:9876
volumes:
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\nameserver-a\logs:/home/rocketmq/logs
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\nameserver-a\store:/home/rocketmq/store
command: sh mqnamesrv
nameserver-b:
image: apache/rocketmq:4.9.2
container_name: nameserver-b
ports:
- 9878:9876
volumes:
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\nameserver-b\logs:/home/rocketmq/logs
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\nameserver-b\store:/home/rocketmq/store
command: sh mqnamesrv
master-a:
image: apache/rocketmq:4.9.2
container_name: master-a
ports:
- 10919:10919
- 10921:10921
- 10922:10922
volumes:
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\broker\master-a\logs:/home/rocketmq/logs
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\broker\master-a\store:/home/rocketmq/store
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\broker\master-a\conf\broker.conf:/home/rocketmq/rocketmq-4.9.2/conf/broker.conf#这里映射的broker.conf文件就是上面四个文件中对应的其中一个
command: sh mqbroker -c /home/rocketmq/rocketmq-4.9.2/conf/broker.conf
environment:
- JAVA_HOME=/usr/lib/jvm/jre
master-b:
image: apache/rocketmq:4.9.2
container_name: master-b
ports:
- 10931:10931
- 10929:10929
- 10932:10932
volumes:
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\broker\master-b\logs:/home/rocketmq/logs
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\broker\master-b\store:/home/rocketmq/store
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\broker\master-b\conf\broker.conf:/home/rocketmq/rocketmq-4.9.2/conf/broker.conf#这里映射的broker.conf文件就是上面四个文件中对应的其中一个
command: sh mqbroker -c /home/rocketmq/rocketmq-4.9.2/conf/broker.conf
environment:
- JAVA_HOME=/usr/lib/jvm/jre
slave-a:
image: apache/rocketmq:4.9.2
container_name: slave-a
ports:
- 10941:10941
- 10939:10939
- 10942:10942
volumes:
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\broker\slave-a\logs:/home/rocketmq/logs
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\broker\slave-a\store:/home/rocketmq/store
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\broker\slave-a\conf\broker.conf:/home/rocketmq/rocketmq-4.9.2/conf/broker.conf#这里映射的broker.conf文件就是上面四个文件中对应的其中一个
command: sh mqbroker -c /home/rocketmq/rocketmq-4.9.2/conf/broker.conf
environment:
- JAVA_HOME=/usr/lib/jvm/jre
slave-b:
image: apache/rocketmq:4.9.2
container_name: slave-b
ports:
- 10951:10951
- 10949:10949
- 10952:10952
volumes:
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\broker\slave-b\logs:/home/rocketmq/logs
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\broker\slave-b\store:/home/rocketmq/store
- F:\Docker\Env\RocketMQ\RocketMQ_Cluster\broker\slave-b\conf\broker.conf:/home/rocketmq/rocketmq-4.9.2/conf/broker.conf#这里映射的broker.conf文件就是上面四个文件中对应的其中一个
command: sh mqbroker -c /home/rocketmq/rocketmq-4.9.2/conf/broker.conf
environment:
- JAVA_HOME=/usr/lib/jvm/jre
console:
image: pangliang/rocketmq-console-ng:latest
container_name: console-cluster
ports:
- 9090:8080
environment:
# - JAVA_OPTS= -Dlogging.level.root=info -Drocketmq.namesrv.addr=nameserver-a:9877;nameserver-b:9878
# - Dcom.rocketmq.sendMessageWithVIPChannel=false
JAVA_OPTS: -Drocketmq.namesrv.addr=nameserver-a:9876;nameserver-b:9876
-Dcom.rocketmq.sendMessageWithVIPChannel=false
-Duser.timezone='Asia/Shanghai'
networks:
default:
external: true
name: docker-network
在运行前需要创建网络docker network create docker-network
最后将docker-compose-rocketmq.yml放在F:\Docker\Env\RocketMQ\RocketMQ_Cluster(根据自己的机器修改),docker-compose-rocketmq.yml映射的目录需要在本地机器提前建好
最后打开cmd对应路径,执行命令docker-compose -f docker-compose-rocketmq.yml up -d
出现绿色的文字表示已经启动成功
打开控制台查看
集群搭建成功!
最后配置Springboot,引入依赖
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.4.0</version>
</dependency>
配置application.yaml中加入
rocketmq:
consumer:
group: aml_cust_consumer_group
# 一次拉取消息最大值,注意是拉取消息的最大值而非消费最大值
pull-batch-size: 10
name-server: 127.0.0.1:9878;127.0.0.1:9877
producer:
# 发送同一类消息的设置为同一个group,保证唯一
group: aml_cust_producer_group
# 发送消息超时时间,默认3000
sendMessageTimeout: 10000
waitTimeMillsInSendQueue: 10000
# 发送消息失败重试次数,默认2
retryTimesWhenSendFailed: 2
# 异步消息重试此处,默认2
retryTimesWhenSendAsyncFailed: 2
# 消息最大长度,默认1024 * 1024 * 4(默认4M)
maxMessageSize: 4096
# 压缩消息阈值,默认4k(1024 * 4)
compressMessageBodyThreshold: 4096
# 是否在内部发送失败时重试另一个broker,默认false
retryNextServer: false
测试
public static void main(String[] args) throws Exception {
//创建一个生产者,指定生产者组为sanyouProducer
DefaultMQProducer producer = new DefaultMQProducer("sanyouProducer");
try {
// 指定NameServer的地址
producer.setNamesrvAddr("127.0.0.1:9877;127.0.0.1:9878");
// 第一次发送可能会超时,我设置的比较大
producer.setSendMsgTimeout(60000);
// 启动生产者
producer.start();
org.apache.rocketmq.common.message.Message message = new org.apache.rocketmq.common.message.Message();
message.setTopic("test-cluster");
message.setBody("测试集群".getBytes());
producer.send((org.apache.rocketmq.common.message.Message) message);
} catch (MQClientException e) {
e.printStackTrace();
} catch (RemotingException e) {
e.printStackTrace();
} catch (MQBrokerException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 关闭生产者
producer.shutdown();
}
}
在控制台中查看消息发送成功