RocketMQ:系统架构
如上图所示:
rocketmq整体架构分为四个核心部分:分别是:NameServer、Broker、Producer,Consumer。
NameServer
- 官方解释:是一个几乎无状态节点,可集群部署,在消息队列 MQ 中提供命名服务,更新和发现 Broker 服务。
- 简单的理解:NameServer相当于配置中心,维护Broker集群、Broker信息、Broker存活信息、主题与队列信息等。Broker向它注册路由信息,同时Client向其获取路由信息。NameServer本身是没有状态的,NameServer彼此之间不通信,每个Broker与集群内所有的Nameserver保持长连接。如果使用过Zookeeper,就比较容易理解了,但是功能比Zookeeper弱。
- 每隔 10s 扫描 broker ,在2分钟内 Nameserver 没有收到 Broker 的心跳包,则关闭该连接,维护当前存活的Broker信息。
Broker
- 官方解释:消息中转角色,负责存储消息,转发消息。分为 Master Broker 和 Slave Broker,一个 Master Broker 可以对应多个 Slave Broker,但是一个 Slave Broker 只能对应一个 Master Broker。Broker 启动后需要完成一次将自己注册至 Name Server 的操作;随后每隔 30s 定期向 Name Server 上报 Topic 路由信息。
- 简单理解:Broker是RocketMQ的核心,提供了消息的接收,存储,拉取等功能,一般都需要保证Broker的高可用,所以会配置Broker Slave,当Master挂掉之后,Consumer就可以消费Slave;Broker分为Master和Slave,一个Master可以对应多个Slave,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave;
Producer
- 官方解释:与 Name Server 集群中的其中一个节点(随机)建立长链接(Keep-alive),定期从 Name Server 读取 Topic 路由信息,并向提供 Topic 服务的 Master Broker 建立长链接,且定时向 Master Broker 发送心跳。
- 简单理解:消息队列的生产者,需要与NameServer建立连接,从NameServer获取Topic路由信息,并向提供Topic服务的Broker Master建立连接;Producer无状态,看集群部署;
Consumer
- 官方解释:与 Name Server 集群中的其中一个节点(随机)建立长连接,定期从 Name Server 拉取 Topic 路由信息,并向提供 Topic 服务的 Master Broker、Slave Broker 建立长连接,且定时向 Master Broker、Slave Broker 发送心跳。Consumer 既可以从 Master Broker 订阅消息,也可以从 Slave Broker 订阅消息,订阅规则由 Broker 配置决定。
- 简单理解:消息队列的消费者,同样与NameServer建立连接,从NameServer获取Topic路由信息,并向提供Topic服务的Broker Master,Slave建立连接;
Topic和Message Queue
topic字面意思就是主题,用来区分不同类型的消息,发送和接收消息前都需要先创建Topic,针对Topic来发送和接收消息,为了提高性能和吞吐量,引入了Message Queue,一个Topic可以设置一个或多个Message Queue,有点类似kafka的分区(Partition),这样消息就可以并行往各个Message Queue发送消息,消费者也可以并行的从多个Message Queue读取消息;
单机配置部署
以下部署在centos7,jdk1.8,rocketmq4.3.2;启动RocketMQ的顺序是先启动NameServer,然后再启动Broker;
1.NameServer启动
[aaa@qq.com bin]# ./mqnamesrv
Java HotSpot(TM) 64-Bit Server VM warning: Using the DefNew young collector with the CMS collector is deprecated and will likely be removed in a future release
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
The Name Server boot success. serializeType=JSON
如上日志表示启动成功,默认端口为9876;
2.Broker启动
[aaa@qq.com bin]# ./mqbroker
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000005c0000000, 8589934592, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 8589934592 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /root/rocketmq-all-4.3.2-bin-release/bin/hs_err_pid3977.log
启动失败,报内存不足,主要是rocketmq默认配置的启动参数值比较大,修改runbroker.sh即可
[aaa@qq.com bin]# vi runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
默认配置的可用内存为8g,虚拟机内存不够,修改为如下即可
JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn128m"
再次启动,日志如下,表示启动成功,默认端口为10911;
[aaa@qq.com bin]# ./mqbroker
The broker[localhost.localdomain, 192.168.237.128:10911] boot success. serializeType=JSON
多级集群部署
分别部署两台NameServer,两台Broker并且分别提供Slave,准备两台电脑分别是本机的windows以及虚拟机centos;
1.启动NameServer
分别启动2台NameServer,端口号都使用默认的9876,地址端口如下:
192.168.237.128:9876
10.13.83.7:9876
2.启动Broker
每台机器上分别启动一个Master和一个Slave,互为主备,在主目录下的conf文件夹下提供了多种broker配置模式,分别有:2m-2s-async,2m-2s-sync,2m-noslave,可以以此为模版做如下配置:
2.1配置10.13.83.7Master和Slave
Master配置如下:
namesrvAddr=192.168.237.128:9876;10.13.83.7:9876
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH
listenPort=10911
storePathRootDir=E:/rocketmq-all-4.3.2-bin-release/store-a-m
Slave配置如下:
namesrvAddr=192.168.237.128:9876;10.13.83.7:9876
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
listenPort=10811
storePathRootDir=E:/rocketmq-all-4.3.2-bin-release/store-a-s
分别启动结果如下:
E:\rocketmq-all-4.3.2-bin-release\bin>mqbroker -c E:\rocketmq-all-4.3.2-bin-release\conf\broker-m.conf
The broker[broker-a, 10.13.83.7:10911] boot success. serializeType=JSON and name
server is 192.168.237.128:9876;10.13.83.7:9876
以上是Master启动日志,Slave日志如下:
E:\rocketmq-all-4.3.2-bin-release\bin>mqbroker -c E:\rocketmq-all-4.3.2-bin-release\conf\broker-s.conf
The broker[broker-a, 10.13.83.7:10811] boot success. serializeType=JSON and name
server is 192.168.237.128:9876;10.13.83.7:9876
2.2配置10.13.83.7Slave
Master配置如下:
namesrvAddr=192.168.237.128:9876;10.13.83.7:9876
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH
listenPort=10911
storePathRootDir=/root/rocketmq-all-4.3.2-bin-release/store-b-m
Slave配置如下:
namesrvAddr=192.168.237.128:9876;10.13.83.7:9876
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
listenPort=10811
storePathRootDir=/root/rocketmq-all-4.3.2-bin-release/store-b-s
启动日志分别如下:
[aaa@qq.com bin]# ./mqbroker -c ../conf/broker-m.conf
The broker[broker-b, 192.168.237.128:10911] boot success. serializeType=JSON and name server is 192.168.237.128:9876;10.13.83.7:9876
[aaa@qq.com bin]# ./mqbroker -c ../conf/broker-s.conf
The broker[broker-b, 192.168.237.128:10811] boot success. serializeType=JSON and name server is 192.168.237.128:9876;10.13.83.7:9876
3.配置说明
1.namesrvAddr
NameServer地址,可以配置多个,用逗号分隔;
2.brokerClusterName
所属集群名称,如果节点较多可以配置多个
3.brokerName
broker名称,master和slave使用相同的名称,表明他们的主从关系
4.brokerId
0表示Master,大于0表示不同的slave
5.deleteWhen
表示几点做消息删除动作,默认是凌晨4点
6.fileReservedTime
在磁盘上保留消息的时长,单位是小时
7.brokerRole
有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;
8.flushDiskType
刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;
9.listenPort
启动监听的端口号
10.storePathRootDir
存储消息的根目录
下一篇: 移除数组中的重复元素-C语言