【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启动

[root@localhost 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启动

[root@localhost 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即可

[root@localhost bin]# vi runbroker.sh

JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"

默认配置的可用内存为8g,虚拟机内存不够,修改为如下即可

JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn128m"

再次启动,日志如下,表示启动成功,默认端口为10911;

[root@localhost 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

启动日志分别如下:

[root@localhost 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

[root@localhost 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

存储消息的根目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值