RocketMQ集群解决⽅案
⼀、应⽤场景及性能(在使⽤RocketMq之前我们要思考这框架能帮我们解决什么现实问题)
1、异步处理,将不是必须的业务逻辑,进⾏异步处理,⽐如注册之后短信、邮箱的发送
2、应⽤解耦,
订单系统:⽤户下单后,订单系统完成持久化处理,将消息写⼊消息队列,返回⽤户订单下单成功。
库存系统:订阅下单的消息,采⽤拉/推的⽅式,获取下单信息,库存系统根据下单信息,进⾏库存操作。
假如:在下单时库存系统不能正常使⽤。也不影响正常下单,因为下单后,订单系统写⼊消息队列就不再关⼼其他的后续操作了。实现订单系统与库存系统的应⽤解耦。
3、流量削锋,也是消息队列中的常⽤场景,⼀般在秒杀或团抢活动中使⽤⼴泛。
应⽤场景:秒杀活动,⼀般会因为流量过⼤,导致流量暴增,应⽤挂掉。为解决这个问题,⼀般需要在应⽤前端加⼊消息队列。
3.1、可以控制活动的⼈数;
3.2、可以缓解短时间内⾼流量压垮应⽤;
3.3、⽤户的请求,服务器接收后,⾸先写⼊消息队列。假如消息队列长度超过最⼤数量,则直接抛弃⽤户请求或跳转到错误页⾯;
3.4、秒杀业务根据消息队列中的请求信息,再做后续处理。
4、⽇志处理
5、消息通讯
消息通讯是指,消息队列⼀般都内置了⾼效的通信机制,因此也可以⽤在纯的消息通讯。⽐如实现点对点消息队列,或者聊天室等。
6、性能:
flash培训RocketMQ单机也可以⽀持亿级的消息堆积能⼒
单机写⼊TPS单实例约7万条/秒,单机部署3个Broker,可以跑到最⾼12万条/秒,消息⼤⼩10个字节
⼆、RocketMQ⽹络部署图
⽹络集群节点描述
1、Name Server 可集群部署,节点之间⽆任何信息同步。
2、Broker(消息中转⾓⾊,负责存储消息,转发消息) 部署相对复杂,Broker 分为Master 与Slave,⼀个Master 可以对应多个Slave,但是⼀个Slave 只能对应⼀个Master,Master 与Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0 表⽰Master,⾮0 表⽰Slave。Master 也可以部署多个。每个Broker 与Name。
3、Producer 与Name Server 集群中的其中⼀个节点(随机选择)建⽴长连接,定期从Name Server 取Topic 路由信息,并向提供Topic 服务的Master 建⽴长连接,且定时向Master 发送⼼跳。Producer 完全⽆状态,可集群部署。
4、Consumer 与Name Server 集群中的其中⼀个节点(随机选择)建⽴长连接,定期从Name Server 取Topic 路由信息,并向提供Topic 服务的Master、Slave 建⽴长连接,且定时向Master、Slave 发送⼼跳。Consumer既可以从Master 订阅消息,也可以从Slave 订阅消息,订阅规则由Broker 配置决定。
三、实际集群部署操作步骤(采⽤多Master多Slave,异步复制集群模式进⾏部署)
hint1、下载部署包
2、将下载的包放⼊并解压到Linux系统指定⽬录中,在这⾥我以/home/⽬录为例,准备四台虚拟机服务器分别为
rocketmq-namerver1:9876;rocketmq-namerver2:9876;rocketmq-namerver3:9876;rocketmq-namerver4:9876
下⾯步骤就不区分是在哪台服务器进⾏操作了,步骤都是⼀样的
quarrel-- 解压
#tar -zxvf alibaba-rocketmq-3.2.
-- 修改配置⽂件由于我们采⽤的是异步复制模式,所以需要修改2m-2s-async配置内容,-- 2m-2s-sync 是代表同步复制模式,2m-noslave是代表单击模式 #修改RoakctMq主节点
#vim /home/alibaba-rocketmq/conf/2m-2s-async/broker-a.properties
#---------------------------------------主节点配置信息----------------------------------------------------
#Broker所属哪个集群,默认【DefaultCluster】
brokerClusterName=Default-RocketMq-Cluster
#broker 实列名称,主从关系的需要保持名称⼀致
brokerName=broker-a
#BrokerId,必须是⼤等于0的整数,0表⽰Master,>0表⽰Slave
brokerId=0
英国留学签证
#brokerIP1=192.168.74.131报考时间和截止时间
#删除⽂件时间点,默认凌晨4点
deleteWhen=04
#⽂件保留时间,默认48⼩时
fileRervedTime=48
#- ASYNC_MASTER 异步复制Master
as far as
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘⽅式 - ASYNC_FLUSH 异步刷盘 - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#Name Server地址
namesrvAddr=rocketmq-namerver1:9876;rocketmq-namerver2:9876;rocketmq-namerver3:9876;rocketmq-namerver4:9876
#Broker对外服务的监听端⼝,默认【10911】
listenPort=10911
defaultTopicQueueNums=4
#是否允许Broker⾃动创建Topic,建议线下开启,线上关闭,默认【true】
autoCreateTopicEnable=true
#是否允许Broker⾃动创建订阅组,建议线下开启,线上关闭,默认【true】
autoCreateSubscriptionGroup=true
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=50000000
destroyMapedFileIntervalForcibly=120000
redeleteHangedFileInterval=120000
diskMaxUdSpaceRatio=88
storePathRootDir=/usr/local/alibaba-rocketmq/data/store
storePathCommitLog=/usr/local/alibaba-rocketmq/data/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/alibaba-rocketmq/data/store/consumequeuepoverty
#消息索引存储路径
avic
storePathIndex=/usr/local/alibaba-rocketmq/data/store/index
#checkpoint ⽂件存储路径
storeCheckpoint=/usr/local/alibaba-rocketmq/data/store/checkpoint
#abort ⽂件存储路径
abortFile=/usr/local/alibaba-rocketmq/data/store/abort
maxMessageSize=65536
flushCommitLogLeastPages=4
flushConsumeQueueLeastPages=2
flushCommitLogThoroughInterval=10000
flushConsumeQueueThoroughInterval=60000
checkTransactionMessageEnable=fal
ndMessageThreadPoolNums=128
pullMessageThreadPoolNums=128
#---------------------------------------结束--->主节点配置信息----------------------------------------------------
#---------------------------------------开始--->从节点配置信息----------------------------------------------------
#修改Salves
#vim /home/alibaba-rocketmq/conf/2m-2s-async/broker-a-s.properties
#Broker所属哪个集群,默认【DefaultCluster】
brokerClusterName=Default-RocketMq-Cluster朋友英文
#broker 实列名称,主从关系的需要保持名称⼀致
brokerName=broker-a
#BrokerId,必须是⼤等于0的整数,0表⽰Master,>0表⽰Slave,⼀个Master可以挂多个Slave,Master与Slave通过BrokerName来配对,默认【0】brokerId=1
#brokerIP1=192.168.74.134
#删除⽂件时间点,默认凌晨4点
deleteWhen=04
#⽂件保留时间,默认48⼩时
fileRervedTime=48
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#刷盘⽅式 - ASYNC_FLUSH 异步刷盘 - SYNC_FLUSH 同步刷盘
matsuyamaflushDiskType=ASYNC_FLUSH
#Name Server地址
namesrvAddr=rocketmq-namerver1:9876;rocketmq-namerver2:9876;rocketmq-namerver3:9876;rocketmq-namerver4:9876
#Broker对外服务的监听端⼝,默认【10911】
listenPort=10911
defaultTopicQueueNums=4
#是否允许Broker⾃动创建Topic,建议线下开启,线上关闭,默认【true】
autoCreateTopicEnable=true
#是否允许Broker⾃动创建订阅组,建议线下开启,线上关闭,默认【true】
autoCreateSubscriptionGroup=true
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=50000000
destroyMapedFileIntervalForcibly=120000
redeleteHangedFileInterval=120000
diskMaxUdSpaceRatio=88
storePathRootDir=/usr/local/alibaba-rocketmq/data/store
storePathCommitLog=/usr/local/alibaba-rocketmq/data/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/alibaba-rocketmq/data/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/alibaba-rocketmq/data/index
#checkpoint ⽂件存储路径
storeCheckpoint=/usr/local/alibaba-rocketmq/data/checkpoint
#abort ⽂件存储路径
abortFile=/usr/local/alibaba-rocketmq/data/abort
maxMessageSize=65536
flushCommitLogLeastPages=4
flushConsumeQueueLeastPages=2
flushCommitLogThoroughInterval=10000
flushConsumeQueueThoroughInterval=60000
checkTransactionMessageEnable=fal
ndMessageThreadPoolNums=128
pullMessageThreadPoolNums=128
#---------------------------------------结束--->从节点配置信息----------------------------------------------------
3、启动RocketMQ
3.1、在rocketmq-namerver1启动Maste broker-a 服务(进⼊/home/alibaba-rocketmq/bin ⽬录)
#nohup sh mqnamesrv &
#nohup sh mqbroker -c /home/alibaba-rocketmq/conf/2m-2s-async/broker-a.properties >/dev/null 2>&1 & 3.2、在rocketmq-namerver4启动Slavebroker-a-s服务(进⼊ /home/alibaba-rocketmq/bin ⽬录)
#nohup sh mqnamesrv &
#nohup sh mqbroker -c /home/alibaba-rocketmq/conf/2m-2s-async/broker-a-s.properties >/dev/null 2>&1 & 3.3、在rocketmq-namerver4启动Slave broker-b服务(进⼊ /home/alibaba-rocketmq/bin ⽬录)
#nohup sh mqnamesrv &
#nohup sh mqbroker -c /home/alibaba-rocketmq/conf/2m-2s-async/broker-b.properties >/dev/null 2>&1 & 3.4、在rocketmq-namerver4启动Slave broker-b-s服务(进⼊ /home/alibaba-rocketmq/bin ⽬录)
#nohup sh mqnamesrv &
#nohup sh mqbroker -c /home/alibaba-rocketmq/conf/2m-2s-async/broker-b-s.properties >/dev/null 2>&1 &
3.3、JPS检查
#jps
查看是否有如下进程,如果有则服务启动成功:
BrokerStartup
NamesrvStartup
关停服务命令:
#sh mqshutdown namesrv
#sh mqshutdown broker
#注意要关闭节点上的防⽕墙,不然集群访问不了,也不能接受Produce消息
-- 查看防⽕墙状态信息
rvice iptables status
-- 关闭防⽕墙(很重要)
rvice iptables stop
3.4、常⽤命令
--查看所有消费组group
#sh mqadmin consumerProgress -n rocketmq-namerver1:9876
--看指定消费组下的所有topic数据堆积情况
#sh mqadmin consumerProgress -n 1rocketmq-namerver1:9876 -g myProducer
查看指定报⽂信息 C0A8718A00002A9F000000000000F790 指的是报⽂在MQ队列中的MSG_ID
#sh mqadmin queryMsgById -n rocketmq-namerver1:9876 -i C0A8718A00002A9F000000000000F790
--查看Topic 列表信息
#sh mqadmin topicList -n rocketmq-namerver1:9876
--查看topic信息列表详情统计
#sh mqadmin topicstatus -n rocketmq-namerver1:9876 -t Topic
--查看集群消息
#sh mqadmin clusterList -n 1rocketmq-namerver1:9876