目录
1.前言
RocketMQ,阿里巴巴开源高性能分布式消息中间件,部署模型如下
Apache RocketMQ 部署架构上主要分为四部分:
- 生产者 Producer
发布消息的角色。Producer通过 MQ 的负载均衡模块选择相应的 Broker 集群队列进行消息投递,投递的过程支持快速失败和重试。
- 消费者 Consumer
消息消费的角色。支持以推(push),拉(pull)两种模式对消息进行消费。同时也支持集群方式和广播方式的消费。提供实时消息订阅机制,可以满足大多数用户的需求。
- 名字服务器 NameServer
NameServer是一个简单的 Topic 路由注册中心,支持 Topic、Broker 的动态注册与发现。
主要包括两个功能:
Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活;
路由信息管理,每个NameServer将保存关于 Broker 集群的整个路由信息和用于客户端查询的队列信息。Producer和Consumer通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。NameServer通常会有多个实例部署,各实例间相互不进行信息通讯。Broker是向每一台NameServer注册自己的路由信息,所以每一个NameServer实例上面都保存一份完整的路由信息。当某个NameServer因某种原因下线了,客户端仍然可以向其它NameServer获取路由信息。
- 代理服务器 Broker
Broker主要负责消息的存储、投递和查询以及服务高可用保证。
NameServer几乎无状态节点,因此可集群部署,节点之间无任何信息同步。Broker部署相对复杂。
在 Master-Slave 架构中,Broker 分为 Master 与 Slave。一个Master可以对应多个Slave,但是一个Slave只能对应一个Master。Master 与 Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId 来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。
2. RocketMQ工作流程
2.1. 启动NameServer
启动NameServer。NameServer启动后监听端口,等待Broker、Producer、Consumer连接,相当于一个路由控制中心。
2.2. 启动 Broker
启动 Broker。与所有 NameServer 保持长连接,定时发送心跳包。心跳包中包含当前 Broker 信息以及存储所有 Topic 信息。注册成功后,NameServer 集群中就有 Topic跟Broker 的映射关系。
2.3. 创建 Topic
创建 Topic 时需要指定该 Topic 要存储在哪些 Broker 上,也可以在发送消息时自动创建Topic。
2.4. 生产者发送消息
生产者发送消息。启动时先跟 NameServer 集群中的其中一台建立长连接,并从 NameServer 中获取当前发送的 Topic存在于哪些 Broker 上,轮询从队列列表中选择一个队列,然后与队列所在的 Broker建立长连接从而向 Broker发消息。
2.5. 消费者接受消息
消费者接受消息。跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,然后开始消费消息。
3. 单机部署RocketMQ 4.9.4
- 环境:
Centos7,JDK:java-1.8.0-openjdk
- 部署流程:
下载二进制包安装 --> 启动NameServer --> 启动Broker --> 测试收发消息 --> 关闭服务(可选)
3.1 下载安装
RocketMQ 的安装包分为两种,二进制包和源码包
二进制包下载:Apache Downloads
源码包下载:https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.9.4/rocketmq-all-4.9.4-source-release.zip
- 二进制包解压后可直接运行,源码包需要编译后运行,这里使用二进包安装的方式
cd /usr/local && wget https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip
unzip rocketmq-all-4.9.4-bin-release.zip
cd rocketmq-all-4.9.4-bin-release
- 可选:nameserver和broker默认启动内存4G,由于主机内存有限,这里将两个服务的内存调小点。方法如下
cd /usr/local/rocketmq-all-4.9.4-bin-release/bin
# 修改nameserver启动内存
vim runserver.sh
# 找到下面的原代码,注释
#JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
#修改为
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
# 修改broker启动内存
vim runbroker.sh
# 找到下面的原代码,注释
#JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"
#修改为
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:PermSize=128m -XX:MaxPermSize=320m"
- 服务开放端口:
namesrv:9876;broker:10909、10911
3.2 启动NameServer
# 启动
nohup sh bin/mqnamesrv &
# 查看是否启动成功
tail -f ./nohup.log
The Name Server boot success... # 表示 启动成功
# 也可查看端口9876是否监听
netstat -lntp|grep 9876
tcp6 0 0 :::9876 :::* LISTEN 27017/java
3.3 启动Broker
# 注意:NameServer成功启动后,才启动Broker
# 需要在添加本机名host解析,否则会报找不到本机名解析地址
# 如本机名test-rocketmq,在/etc/hosts中添加记录127.0.0.1 test-rocketmq
# -n 表示指定nameserver的地址和端口,部署在同一台机用localhost:9876即可
nohup sh bin/mqbroker -n localhost:9876 &
# 查看是否启动成功
tail -f ./nohup.log
The broker[test-rocketmq, 172.16.1.5:10911] boot success.
# 查看端口是否启动
netstat -lnpt|grep 1091
tcp6 0 0 :::10911 :::* LISTEN 27027/java
tcp6 0 0 :::10912 :::* LISTEN 27027/java
3.4 测试消息收发
$ export NAMESRV_ADDR=localhost:9876
# 测试消息发送
$ sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
SendResult [sendStatus=SEND_OK, msgId= ...
# 测试消息消费
$ sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
3.5 服务关闭
$ sh bin/mqshutdown broker
The mqbroker(27027) is running...
Send shutdown request to mqbroker(27027) OK
$ sh bin/mqshutdown namesrv
The mqnamesrv(27017) is running...
Send shutdown request to mqnamesrv(27017) OK
4. docker部署rocketmq dashboard
RocketMQ Dashboard 是 RocketMQ 的管控利器,为用户提供客户端和应用程序的各种事件、性能的统计信息,支持以可视化工具代替 Topic 配置、Broker 管理等命令行操作。支持功能有:
- 创建主题Topoic
- 创建消费者组 consumer
- 重置消费位点
- 扩容 Topic 队列
- 扩容 Broker
- 发送消息
官方文档:RocketMQ Dashboard | RocketMQ
注:面板不带用户权限管理,安装方式支持源码和docker
安装
$ docker pull apacherocketmq/rocketmq-dashboard:latest
# 注意运行前将127.0.0.1:9876改成nameserver运行主机的IP地址
$ docker run -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=127.0.0.1:9876" -p 8080:8080 -t apacherocketmq/rocketmq-dashboard:latest
访问控制台:http://127.0.0.1:8080