消息中间件- RocketMQ

482 阅读9分钟

1.RocketMQ介绍

RocketMQ是阿里巴巴在2012年开源的一款高性能、高吞吐量的分布式消息中间件,目前已经捐赠给Apache基金会,并于2016年11月成为 Apache 孵化项目

2.功能特性

RocketMQ是一款低延迟、高可靠、可伸缩、易于使用的消息中间件。具有以下特性:

①是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点。

②Producer,Consumer,队列都可以做成分布式。

③Producer向一些队列轮流发送消息,队列集合称为Topic,Consumer 如果做广播消费,则一个 consumer实例消费这个Topic对应的所有队列,如果做集群消费,则多个Consumer实例平均消费这个 topic对应的队列集合。

④能够保证严格的消息顺序,支持消息回溯

⑤提供丰富的消息拉取模式。

⑥高效的订阅者水平扩展能力。

⑦实时的消息订阅机制。

⑧亿级消息堆积能力。

⑨较少的依赖。

3.不同MQ中间件比较

纬度rabbitmqkafkarocketmq
定位传统消息中间件,保证消息的可靠性日志消息非日志的可靠传输
可用性cluster普通模式,镜像队列模式异步刷盘,可能出现数据丢失实现异步/同步刷盘
单机吞吐量1w10w10w
积压消息能力根据内存和磁盘阀值来决定非常好,受磁盘限制非常好,受磁盘限制
顺序消费支持支持支持
定时消息支持不支持支持
事务消息不支持不支持支持
消息重试支持不支持支持
死信队列支持不支持支持

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