第2章 生产环境下的配置和使用

本章的目的是带领读者快速将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 。

图2 -1 RocketMQ 各个角色间关系

了解了四种角色以后, 再介绍一下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 的配置信息,查询特定消息等各种操作。本节将介绍几个常用的命令。

  1. 创建/修改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 名称
  1. 删除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 名称
  1. 创建/修改订阅组
    订阅组在提高系统的高可用性和吞吐量方面扮演着重要的角色,比如用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
  1. 删除订阅组
    与创建或修改订阅组相对应,这个命令删除不再使用的订阅组,指令是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
  1. 更新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
  1. 更新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 名称
  1. 查询Topic 的路由信息
    Topic 的路由信息指的是某个Topic 所在的Broker 相关信息,客户端可以通过NameServer 来获取这些信息,本命令一般在调试的时候使用,指令是TopicRoute ,表2-7 列出了支持的参数。
参数 是否必填 说明
-h 打印帮助
-n NameServe 服务地址列表,举例:192.168.0.1:9876;192.168.0.2:9876
-t Topic名称
  1. 查看Topic 列表信息
    上面提到的TopicRoute 是列出某个Topic 的相关信息,还有个指令TopicList用来列出集群中所有Topic 的名称,表2-8 列出了支持的参数。
参数 是否必填 说明
-h 打印帮助
-n NameServe 服务地址列表,举例:192.168.0.1:9876;192.168.0.2:9876
-t Topic名称
  1. 根据时间查询消息
    一条消息被发送到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
  1. 根据消息ID 查询消息
    根据消息ID 可以精确定位到某条消息,但是消息ID 需要通过其他方式来获取, 比如可以先用时间来查询出一些消息,然后定位到要找的具体某个消息,指令是queryMsgByld ,表2-11列出了支持的参数。
参数 是否必填 说明
-i 消息ID
-h 打印帮助
-n NameServe 服务地址列表,举例:192.168.0.1:9876;192.168.0.2:9876
  1. 查看集群消息
    指令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,即根据实际场景选择合适的发送消息和接收消息的方式。

你可能感兴趣的:(第2章 生产环境下的配置和使用)