1.RocketMQ介绍
RocketMQ是阿里巴巴在2012年开源的一款高性能、高吞吐量的分布式消息中间件,目前已经捐赠给Apache基金会,并于2016年11月成为 Apache 孵化项目
2.功能特性
RocketMQ是一款低延迟、高可靠、可伸缩、易于使用的消息中间件。具有以下特性:
①是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点。
②Producer,Consumer,队列都可以做成分布式。
③Producer向一些队列轮流发送消息,队列集合称为Topic,Consumer 如果做广播消费,则一个 consumer实例消费这个Topic对应的所有队列,如果做集群消费,则多个Consumer实例平均消费这个 topic对应的队列集合。
④能够保证严格的消息顺序,支持消息回溯
⑤提供丰富的消息拉取模式。
⑥高效的订阅者水平扩展能力。
⑦实时的消息订阅机制。
⑧亿级消息堆积能力。
⑨较少的依赖。
3.不同MQ中间件比较
纬度 | rabbitmq | kafka | rocketmq |
---|---|---|---|
定位 | 传统消息中间件,保证消息的可靠性 | 日志消息 | 非日志的可靠传输 |
可用性 | cluster普通模式,镜像队列模式 | 异步刷盘,可能出现数据丢失 | 实现异步/同步刷盘 |
单机吞吐量 | 1w | 10w | 10w |
积压消息能力 | 根据内存和磁盘阀值来决定 | 非常好,受磁盘限制 | 非常好,受磁盘限制 |
顺序消费 | 支持 | 支持 | 支持 |
定时消息 | 支持 | 不支持 | 支持 |
事务消息 | 不支持 | 不支持 | 支持 |
消息重试 | 支持 | 不支持 | 支持 |
死信队列 | 支持 | 不支持 | 支持 |
4.RocketMQ系统组成
Producer: RocketMQ提供多种消息发送方式,同步发送,异步发送,顺序发送,单向发送。同步发送,异步发送都需要broker给一个应答,单向发送不需要。akcs:0,1,-1
Consumer:两种消费形式;拉取模式,推送模式
Broker:做一个中转的角色,负责存储消息,转发消息
Name Server: 路由,类似zookeeper做注册中心使用,broker会把注册地址注册到Name Server
Topic: 表示一类消息的集合,每个主题可以存储很多的消息,每个消息都属于一个主题,topic是RocketMQ进行消息订阅的基本单位
Tag: 消息标签,用于在同一个主题下面区分不同类型的消息
MessageQueue:对每个Topic都可以设置一定数量的消息队列来进行数据的拉取
5.单机快速启动与安装
1.下载RocketMQ安装包:https://archive.apache.org/dist/rocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip
2.解压:unzip rocketmq-all-4.7.1-bin-release.zip
3. cd /usr/local/rocketmq-all-4.7.1-release 进入到rocketmq目录下
启动与关闭NameServer
先启动NameServer,然后启动Broker,并向NameServer注册自己
# 进入/usr/local/rocketmq-all-4.7.1-release/bin目录下
# 启动之前根据本机内存大小,调整一下runserver.sh中JAVA_OPT的内存设置
# 启动NameServer
nohup /usr/local/usr/local/rocketmq-all-4.7.1-release/bin/mqnamesrv &
# 查看NameServer日志
tail -f ~/logs/rocketmqlogs/namesrv.log
# 关闭
/usr/local/usr/local/rocketmq-all-4.7.1-release/bin/mqshutdown namesrv
# 验证
通过执行命令jps,如果终端出现:
21980 NamesrvStartUp
出现NameServer安装成功
启动与关闭Broker
# 启动之前根据本机内存大小,调整一下runbroker.sh中JAVA_OPT的内存设置
# 启动broker
nohup /usr/local/usr/local/rocketmq-all-4.7.1-release/bin/mqbroker &
# 查看Broker启动日志
tail -f ~/logs/rocketmqlogs/broker.log
# 关闭
/usr/local/usr/local/rocketmq-all-4.7.1-release/bin/mqshutdown broker
# 验证
通过执行命令jps,如果终端出现:
21911 BrokerStartUp
出现Broker安装成功
6.集群模式安装
准备两台服务器,192.168.1.1,192.168.1.2
1.192.168.1.1服务器上修改配置文件broker-a.propterties
# 集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示Master,大于0表示Slave
brokerId=0
#nameServer地址
namesrvAddr=rocketmq-node1:9876;rocketmq-node2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许Broker自动创建Topic,建议线下开启,生产环境应关闭
autoCreateTopicEnable=true
#是否允许Broker自动创建订阅组,建议线下开启,生产环境应关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认48小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/data/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/data/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/data/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/data/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
2.192.168.1.1服务器上修改配置文件broker-b.propterties
brokerClusterName=rocketmq-cluster
brokerName=broker-b
brokerId=1
namesrvAddr=rocketmq-node1:9876;rocketmq-node2:9876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=11011
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=300000
diskMaxUsedSpaceRatio=88
storePathRootDir=/data/rocketmq/store-s
storePathCommitLog=/data/rocketmq/store-s/commitlog
storePathConsumeQueue=/data/rocketmq/store-s/consumequeue
storePathIndex=/data/rocketmq/store-s/index
storeCheckpoint=/data/rocketmq/store-s/checkpoint
abortFile=/data/rocketmq/store-s/abort
maxMessageSize=65536
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
3.192.168.1.2服务器上修改配置文件broker-a-s.propterties
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0表示Master,大于0表示Slave
brokerId=1
#nameServer地址,分号分割
namesrvAddr=rocketmq-n1:9876;rocketmq-n2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,生产环境关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,生产环境关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/rocketmq/store-s
#commitLog 存储路径
storePathCommitLog=/data/rocketmq/store-s/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/rocketmq/store-s/consumequeue
#消息索引存储路径
storePathIndex=/data/rocketmq/store-s/index
#checkpoint 文件存储路径
storeCheckpoint=/data/rocketmq/store-s/checkpoint
#abort 文件存储路径
abortFile=/data/rocketmq/store-s/abort
#限制的消息大小
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=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
4.192.168.1.2 服务器上修改配置文件broker-b.propterties
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0表示Master,大于0表示Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=rocketmq-node1:9876;rocketmq-node2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,生产环境关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,生产环境关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/data/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/data/rocketmq/store/index
#checkpoint文件存储路径
storeCheckpoint=/data/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/data/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
5.启动集群
# 分别在两台虚拟机上执行 192.168.1.1
mkdir /data/rocketmq/store -p
mkdir /data/rocketmq/store/commitlog -p
mkdir /data/rocketmq/store/consumequeue -p
mkdir /data/rocketmq/store/index -p
# 192.168.1.1
mkdir /data/rocketmq/store-s -p
mkdir /data/rocketmq/store-s/commitlog -p
mkdir /data/rocketmq/store-s/consumequeue -p
mkdir /data/rocketmq/store-s/index -p
#停止broker namesrv
cd /usr/local/rocketmq/conf/2m-2s-sync
sh /usr/local/rocketmq/bin/mqshutdown broker
sh /usr/local/rocketmq/bin/mqshutdown namesrv
# 在192.168.1.2上执行
nohup /usr/local/rocketmq/bin/mqbroker -c /usr/local/rocketmq/conf/2m-
2s-sync/broker-a.properties &
nohup /usr/local/rocketmq/bin/mqbroker -c /usr/local/rocketmq/conf/2m-
2s-sync/broker-b-s.properties &
# 在192.168.1.2上执行
nohup /usr/local/rocketmq/bin/mqbroker -c /usr/local/rocketmq/conf/2m-
2s-sync/broker-b.properties &
nohup /usr/local/rocketmq/bin/mqbroker -c /usr/local/rocketmq/conf/2m-
2s-sync/broker-a-s.properties &
# 查看集群信息
/usr/local/rocketmq/bin/mqadmin clusterlist -n
192.168.1.1:9876;192.168.1.2:9876
# 关闭
sh /usr/local/rocketmq/bin/mqshutdown broker
sh /usr/local/rocketmq/bin/mqshutdown namesrv
6.RocketMQ Web界面
git clone https://github.com/apache/rocketmq-externals
cd rocketmq-externals/rocketmq-console
mvn clean package -Dmaven.test.skip=true
# 启动
nohup java -jar rocketmq-console-ng-2.0.0.jar --server.port=8081 --
rocketmq.config.namesrvAddr=192.168.1.1:9876\;192.168.1.2:9876 >>
/root/logs/rocketmqlogs/mq-console.log 2>&1 &
7.发送和接收消息
# 进入到/usr/local/usr/local/rocketmq-all-4.7.1-release/bin目录下
cd /usr/local/usr/local/rocketmq-all-4.7.1-release/bin
sh mqadmin updateTopic -t TopicHello -n localhost:9876 -b localhost:10911
# 使用RocketMQ发送消息
sh tools.sh org.apache.rocketmq.example.quickstart.Producer
# 使用RocketMQ启动消费者消费消息
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer