欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

RocketMQ:系统架构

程序员文章站 2022-07-14 07:54:23
...

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

存储消息的根目录