本章的目的是带领读者快速将RocketMQ 应用到生产环境中,因此不会探究原理和细节。本章会先介绍RocketMQ 的各个角色,然后介绍如何搭建一个高可用的分布式消息队列集群, 以及 RocketMQ 的 Consumer 和 Producer 的使用方法与常用命令。
2.1 RocketMQ 各部分角色介绍
RocketMQ 由四部分组成,先来直观地了解一下这些角色以及各自的功能。分布式消息队列是用来高效地传输消息的,它的功能和现实生活中的邮局收发信件很类似,我们类比地说一下相应的模块。现实生活中的邮政系统要正常运行,离不开下面这四个角色, 一是发信者, 二是收信者, 三是负责暂存、传输的邮局, 四是负责协调各个地方邮局的管理机构。 对应到 RocketMQ 中,这四个角色就是Producer 、Consumer 、Broker 和NameServer。
启动RocketMQ 的顺序是先启动NameServer ,再启动Broker ,这时候消息队列已经可以提供服务了,想发送消息就使用Producer 来发送,想接收消息就使用Consumer 来接收。很多应用程序既要发送,又要接收,可以启动多个Producer 和Consumer 来发送多种消息,同时接收多种消息。
为了消除单点故障,增加可靠性或增大吞吐量,可以在多台机器上部署多个NameServer 和Broker ,为每个Broker 部署一个或多个Slave 。
了解了四种角色以后, 再介绍一下Topic 和Message Queue 这两个名词。一个分布式消息队列中间件部署好以后,可以给很多个业务提供服务,同一个业务也有不同类型的消息要投递, 这些不同类型的消息以不同的Topic 名称来区分。所以发送和接收消息前,先创建Topic , 针对某个Topic 发送和接收消息。有了Topic 以后,还需要解决性能问题。如果一个Topic 要发送和接收的数据量非常大, 需要能支持增加并行处理的机器来提高处理速度,这时候一个Topic 可以根据需求设置一个或多个Message Queue, Message Queue 类似分区或Partition(对比kafka) 。Topic 有了多个Message Queue 后,消息可以并行地向各个Message Queue 发送,消费者也可以并行地从多个Message Queue 读取消息并消费。
2.2 多机集群配置和部署
书中示例搭建一个双主双从的RocketMQ集群,怎么搭建可以参考我之前写的博客
2.3 发送/接收消息示例
书中介绍了一些示例代码,由于我暂时不懂java代码。所以在这里,我会使用前面快速开始中使用的生产者和消费者的示例来收发消息。
消息的发送,单纯只用示例的生产者的话会发送一堆,要发送自己想要的消息,我这里使用 rocket-console。rocket-console 的安装可以参考我的博客
2.4 常用管理命令
MQAdmin 是RocketMQ 自带的命令行管理工具,在bin 目录下,运行mqadmin 即可执行。使用mqadmin 命令,可以进行创建、修改Topic ,更新Broker 的配置信息,查询特定消息等各种操作。本节将介绍几个常用的命令。
- 创建/修改Topic
消息的发送和接收都要有对应的Topic , 需要向某个Topic 发送或接收消息,所以在正式使用RocketMQ 进行消息发送和接收前,要先创建Topic ,创建Topic 的指令是updateTopic ,表2-1 列出了支持的参数。
参数 |
是否必填 |
说明 |
-b |
如果-c 为空,则必填 |
Broker 地址, Topic 所在的Broker( 192.168.0.1: 10911) |
-c |
如果-b 为空,则必填 |
Cluster名称,表示Topic 创建在该集群(集群可通过cluster List查询),如果集群中有多个master 角色的Broker , 默认在每个Broker上创建8 个读写队列 |
-h |
否 |
打印帮助 |
-n |
是 |
NameServe 服务地址列表,举例: 192.168.0.1:9876;192.168.0. 2:9876 |
-p |
否 |
指定新Topic 的权限限制,(2 [ 4 [6), [2:W 4:R; 6:RW] |
-r |
否 |
可读队列数(默认为8 ) |
-w |
否 |
可写队列数(默认为8 ) |
-t |
是 |
Topic 名称 |
- 删除Topic
与创建/修改Top ic 对应的是删除Topic ,把RocketMQ 系统中不用的Topic 彻底清除,指令是deleteTopic , 表2-2 列出了支持的参数。
参数 |
是否必填 |
说明 |
-c |
如果-b 为空,则必填 |
Cluster名称,表示Topic 创建在该集群(集群可通过cluster List查询),如果集群中有多个master 角色的Broker , 默认在每个Broker上创建8 个读写队列 |
-h |
否 |
打印帮助 |
-n |
是 |
NameServe 服务地址列表,举例: 192.168.0.1:9876;192.168.0. 2:9876 |
-t |
是 |
Topic 名称 |
- 创建/修改订阅组
订阅组在提高系统的高可用性和吞吐量方面扮演着重要的角色,比如用Clustering 模式消费一个Topic 里的消息内容时,可以启动多个消费者并行消费,每个消费者只消费Topic 里消息的一部分,以此提高消费速度,这个时候就是通过订阅组来指明哪些消费者是同一组,同一组的消费者共同消费同一个Topic 里的内容。订阅组可以被自动创建,使用这个命令一般是用来修改订阅组,指令是updatesubGroup ,表2-3 列出了支持的参数。
参数 |
是否必填 |
说明 |
-b |
如果-c 为空,则必填 |
Broker 地址,创建订阅组所在的Broker |
-c |
如果-b 为空,则必填 |
Cluster 名称,创建订阅组所在的Cluster |
-d |
否 |
是否容许广播方式消费 |
-g |
是 |
订阅组名 |
-i |
否 |
从哪个Broker 开始消费 |
-m |
否 |
是否容许从队列的最小位置开始消费(true l false),默认会设置为true |
-q |
否 |
消费失败的消息放到一个重试队列,每个订阅组配置的重试队列数量 |
-r |
否 |
重试消费最大次数,超过则投递到死信队列 |
-s |
否 |
消费功能是否开启 |
-w |
否 |
发现消息堆积后,将Con s umer 的消费请求重定向到另外一台Broker 机器 |
-h |
否 |
打印帮助 |
-n |
是 |
NameServe 服务地址列表,举例:192.168.0.1:9876;192.168.0.2:9876 |
- 删除订阅组
与创建或修改订阅组相对应,这个命令删除不再使用的订阅组,指令是deleteSubGroup ,表2-4 列出了支持的参数。
参数 |
是否必填 |
说明 |
-b |
如果-c 为空,则必填 |
Broker 地址,创建订阅组所在的Broker |
-c |
如果-b 为空,则必填 |
Cluster 名称,创建订阅组所在的Cluster |
-g |
是 |
订阅组名 |
-h |
否 |
打印帮助 |
-n |
是 |
NameServe 服务地址列表,举例:192.168.0.1:9876;192.168.0.2:9876 |
- 更新Broker 配置
Broker 有很多的配置信息,在Broker 启动时,可以通过配置文件来指定配置信息。有些配置信息支持在Broker 运行的时候动态更改,更改指令是updateBrokerConfig , 表2-5 列出了支持的参数。
参数 |
是否必填 |
说明 |
-b |
如果-c 为空,则必填 |
Broker 地址,创建订阅组所在的Broker |
-c |
如果-b 为空,则必填 |
Cluster 名称,创建订阅组所在的Cluster |
-k |
是 |
Key值 |
-v |
否 |
Value值 |
-h |
否 |
打印帮助 |
-n |
是 |
NameServe 服务地址列表,举例:192.168.0.1:9876;192.168.0.2:9876 |
- 更新Topic 的读写权限
RocketMQ 支持对Topic 进行权限控制, 主要分为只读的Topic 和可读写的Topic ,权限可以通过指令updateTopicPerm 来动态改变,表2-6 列出了支持的参数。
参数 |
是否必填 |
说明 |
-b |
如果-c 为空,则必填 |
Broker 地址,创建订阅组所在的Broker |
-c |
如果-b 为空,则必填 |
Cluster 名称,创建订阅组所在的Cluster |
-h |
否 |
打印帮助 |
-n |
是 |
NameServe 服务地址列表,举例:192.168.0.1:9876;192.168.0.2:9876 |
-p |
否 |
指定新Topic 的权限限制,(2|4|6 ),[2:W 4:R; 6:RW] |
-t |
是 |
Topic 名称 |
- 查询Topic 的路由信息
Topic 的路由信息指的是某个Topic 所在的Broker 相关信息,客户端可以通过NameServer 来获取这些信息,本命令一般在调试的时候使用,指令是TopicRoute ,表2-7 列出了支持的参数。
参数 |
是否必填 |
说明 |
-h |
否 |
打印帮助 |
-n |
是 |
NameServe 服务地址列表,举例:192.168.0.1:9876;192.168.0.2:9876 |
-t |
是 |
Topic名称 |
- 查看Topic 列表信息
上面提到的TopicRoute 是列出某个Topic 的相关信息,还有个指令TopicList用来列出集群中所有Topic 的名称,表2-8 列出了支持的参数。
参数 |
是否必填 |
说明 |
-h |
否 |
打印帮助 |
-n |
是 |
NameServe 服务地址列表,举例:192.168.0.1:9876;192.168.0.2:9876 |
-t |
是 |
Topic名称 |
- 根据时间查询消息
一条消息被发送到RocketMQ 后, 默认会带上发送的时间戳, 所以我们可以根据估计的时间来查询消息,指令是printMsg ,表2-10 列出了支持的参数。
参数 |
是否必填 |
说明 |
-b |
否 |
开始时间戳 |
-d |
否 |
结束时间戳 |
-h |
否 |
打印帮助 |
-t |
是 |
Topic名称 |
-s |
否 |
Tag 名称举例:TagA II TagB |
-n |
是 |
NameServe 服务地址列表,举例:192.168.0.1:9876;192.168.0.2:9876 |
- 根据消息ID 查询消息
根据消息ID 可以精确定位到某条消息,但是消息ID 需要通过其他方式来获取, 比如可以先用时间来查询出一些消息,然后定位到要找的具体某个消息,指令是queryMsgByld ,表2-11列出了支持的参数。
参数 |
是否必填 |
说明 |
-i |
是 |
消息ID |
-h |
否 |
打印帮助 |
-n |
是 |
NameServe 服务地址列表,举例:192.168.0.1:9876;192.168.0.2:9876 |
- 查看集群消息
指令cluster List 用来列出集群的状态,看看有哪些Broker 在提供服务,表2-12 列出了支持的参数。
参数 |
是否必填 |
说明 |
-m |
否 |
是有打印更多信息 |
-h |
否 |
打印帮助 |
-n |
是 |
NameServe 服务地址列表,举例:192.168.0.1:9876;192.168.0.2:9876 |
2.5 通过图形界面管理集群
对于RocketMQ 新手,可以启动运维服务,从页面上直观看到消息队列集群的状态。有一定经验以后,可以使用命令行更快捷,其功能更全面。这里请看我前面提到的rocketmq-console,博客
2.6 本章小结
在生产环境中使用RocketMQ 集群需要比QuickStart 部分了解更多的内容,本章在机器角色、集群配置和部署,以及集群管理方面都做了介绍,用户可以基于这些内容搭建起一个生产环境的RocketMQ 消息队列集群,在数据量不大的非关键场景,可以通过这一章快速上线。下一章重点讲如何用好RocketMQ,即根据实际场景选择合适的发送消息和接收消息的方式。