【整理】初识RocketMQ

看完JavaEE慕课RocketMQ部分后,自己使用docker搭建RocketMQ环境的过程以及一些知识点。

一些术语

Producer

消息生产者,生产者的作用就是将消息发送到 MQ,生产者本身既可以产生消息,如读取文本信息等。也可以对外提供接口,由外部应用来调用接口,再由生产者将收到的消息发送到 MQ。

Producer Group

生产者组,简单来说就是多个发送同一类消息的生产者称之为一个生产者组。在这里可以不用关心,只要知道有这么一个概念即可。

Consumer

消息消费者,简单来说,消费 MQ 上的消息的应用程序就是消费者,至于消息是否进行逻辑处理,还是直接存储到数据库等取决于业务需要。

Consumer Group

消费者组,和生产者类似,消费同一类消息的多个 consumer 实例组成一个消费者组。

Topic

Topic 是一种消息的逻辑分类,比如说你有订单类的消息,也有库存类的消息,那么就需要进行分类,一个是订单 Topic 存放订单相关的消息,一个是库存 Topic 存储库存相关的消息。

Message

Message 是消息的载体。一个 Message 必须指定 topic,相当于寄信的地址。Message 还有一个可选的 tag 设置,以便消费端可以基于 tag 进行过滤消息。也可以添加额外的键值对,例如你需要一个业务 key 来查找 broker 上的消息,方便在开发过程中诊断问题。

Tag

标签可以被认为是对 Topic 进一步细化。一般在相同业务模块中通过引入标签来标记不同用途的消息。

Broker

Broker 是 RocketMQ 系统的主要角色,其实就是前面一直说的 MQ。Broker 接收来自生产者的消息,储存以及为消费者拉取消息的请求做好准备。

Name Server

Name Server 为 producer 和 consumer 提供路由信息。

RocketMQ架构

RocketMQ架构

其工作流程主要如下:

  1. 启动NameServer,NameServer起来后监听端口,等待Broker、Producer、Consumer连上来,相当于一个路由控制中心。
  2. Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。
  3. 收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。
  4. Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。
  5. Consumer跟Producer类似,跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,开始消费消息。

RocketMQ的搭建

通过RocketMQ的工作流程可以了解到,除了Producer和Consumer为编写的应用程序外,其中起重要作用的还有NameServer和Broker,因此下面主要介绍这两者的搭建,这里假定你已经安装好docker。

配置并启动NameServer

  1. 先使用docker search命令,查询可用的RocketMQ镜像

    docker search rocketmq
  2. 查询到可用的RocketMQ镜像如下:
    file

  3. 这里使用docker pull命令,选择拉取rocketmqinc/rocketmq镜像

    docker pull rocketmqinc/rocketmq
  4. 创建并启动NameServer容器

    docker run -d -p 9876:9876 -v {RmHome}/data/namesrv/logs:/root/logs -v {RmHome}/data/namesrv/store:/root/store --name rmqnamesrv -e "MAX_POSSIBLE_HEAP=100000000" rocketmqinc/rocketmq sh mqnamesrv

    上面的命令帮助你在后台创建并启动RocketMQ的NameServer容器,
    –name 参数将容器命名为rmqnamesrv
    -p 参数映射容器内的9876端口到主机
    -v 参数映射容器内路径到主机,你需要将{RmHome}替换为想要保存数据和日志的目录

  5. 不出现意外的话,你可以在{RmHome}/data/namesrv/logs/namesrv.log日志中看到NameServer启动成功的记录
    file

配置并启动Broker

由于搭建 NameServer 时已经拉取 RocketMQ 镜像,这里只要直接使用即可,在启动broker之前,你还需要对broker进行配置,在{RmHome}/conf目录下创建broker.conf配置文件:

你需要将{RmHome}替换为想要保存数据和日志的目录

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1 = {docker宿主机IP}

由于Boker是被部署在docker容器中的,在创建容器前还未分配IP,因此你可以先将brokerIP1配置留空,使用如下的命令创建一个运行Broker服务的docker容器后,再返回填写。

创建一个运行Broker服务的docker容器:

docker run -d -p 10911:10911 -p 10909:10909 -v  {RmHome}/data/broker/logs:/root/logs -v  {RmHome}/rocketmq/data/broker/store:/root/store -v  {RmHome}/conf/broker.conf:/opt/rocketmq/conf/broker.conf --name rmqbroker --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" -e "MAX_POSSIBLE_HEAP=200000000" rocketmqinc/rocketmq sh mqbroker -c /opt/rocketmq/conf/broker.conf

查看刚刚创建的docker容器IP,使用docker inspect命令:
查看docker宿主机IP
在IPAddress字段,你可以看到docker容器的IP,然后返回填写上面的broker.conf配置文件即可。
最终的broker.conf文件内容

重启Broker的Docker容器即可:

docker restart rmqbroker

RocketMQ可视化监控工具

RocketMQ有一个对其扩展的开源项目incubator-rocketmq-externals,这个项目中有一个子模块叫rocketmq-console,通过这个工具可以更直观地显示RocketMQ的运行状态。

file

它同样可以通过docker安装使用,先拉取rocketmq-console-ng的docker镜像:

docker pull styletang/rocketmq-console-ng

然后创建一个名为rmqconsole的容器运行rocketmq-console-ng服务,并将Web端口从8080映射到主机的8899端口:

sudo docker run -d --name rmqconsole -e "JAVA_OPTS=-Drocketmq.config.namesrvAddr={{Gateway地址}}:9876 -Drocketmq.config.isVIPChannel=false" -p 8899:8080 -t styletang/rocketmq-console-ng

其中Gateway地址你可以通过docker inspect命令,查看其它已存在的容器得到,以rmqbroker容器为例:

docker inspect rmmqbroker

图中标记的地址即是你所需要的Gateway地址:
file

最后,你就可以通过http://127.0.0.1:8899 访问rocketmq-console了。

参考文章

发布者

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注