JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

往期内容

JAVA应用开发MQ实战最佳实践——Series1:RocketMQ综述及代码设计

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

1. 消息队列RocketMQ性能测试案例

1.1 RocketMQ测试分析

客户场景,信息共享交换平台:
1.交换平台需支持每秒万级别数据传输
2.实现跨路段、跨部门、跨行业、跨区域信息即时共享,做到高可靠、低延迟

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

客户现场展示场景设计思路:
1.针对性的编写一套JAVA代码来支撑本次MQ性能POC验证。
2.选择合适规格的单台ECS,在单个TOPIC下运行多线程代码实现和MQ的订阅发送,统计1分钟内订阅和发送的数据交换TPS情况。
3.考虑POC也要符合客户实际生产场景中MQ使用逻辑,ECS应运行4个独立的JAR包,两对JAR包交叉经过MQ进行数据交换。
4.消息体内的内容应打印到屏幕,通过消息轨迹验证消息的被消费情况。
5.验证结果:客户指定场景下8线程异步,1分钟TPS在10K以上。

1.2 创建资源

本章节详细描述如何创建消息队列 RocketMQ 版的资源。

1.2.1 创建RocketMQ实例

1.登录Apsara Stack控制台。
2.在左侧导航栏中单击中间件产品 > 消息队列访问管理控制台界面。

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

3.在消息队列页面,选择区域与部门后,单击MQ,进入MQ控制台。

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

4.单击左侧导航栏概览后,在概览页面中,单击创建实例。
5.在创建实例对话框,选择实例类型,并输入实例名和描述,然后单击确认。

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

说明: 创建完实例后,单击左侧导航栏实例详情,可以查看创建实例的Topic数上限、消息发送TPS上限、消息订阅TPS上限和TCP协议接入地址等。

1.2.2 创建 Topic

Topic 是消息队列 RocketMQ 版里对消息的一级归类,例如可以创建 Topic_Trade 这一 Topic 来识别交易类消息,消息生产者将消息发送到 Topic_Trade,而消息消费者则通过订阅该 Topic 来获取和消费消息。
创建Topic要注意一下几点:

  • Topic 不能跨实例使用,例如在实例 A 中创建的 Topic A 不能在实例 B 中使用。
  • Topic 名称必须在同一实例中是唯一的。
  • 您可创建不同的 Topic 来发送不同类型的消息,例如用 Topic A 发送普通消息,Topic B 发送事务消息,Topic C 发送定时/延时消息。

1.在控制台左侧导航栏,单击 Topic 管理。
2.在 Topic 管理页面上方选择刚创建的实例,单击创建 Topic 按钮。

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

3.在创建 Topic 对话框中的 Topic 一栏,输入 Topic 名称,选择该 Topic 对应的消息类型,输入该 Topic 的备注内容,然后单击确定。

1.2.3 创建 Group ID

创建完实例和 Topic 后,您需要为消息的消费者(或生产者)创建客户端 ID ,即 Group ID 作为标识。

  • Group ID 必须在同一实例中是唯一的。
  • Group ID 和 Topic 的关系是 N:N,即一个消费者可以订阅多个 Topic,同一个 Topic 也可以被多个消费者订阅;一个生产者可以向多个 Topic 发送消息,同一个 Topic 也可以接收来自多个生产者的消息。

1.在控制台左侧导航栏,单击 Group 管理。
2.在 Group 管理页面上方选择刚创建的实例,然后选择TCP协议 > 创建Group ID 。本文以 TCP 协议为例。

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

3.在创建 Group ID 对话框中,输入 Group ID 和描述,然后单击确认。

1.3 场景落地

1.准备p1,c1,p2,c2双发送双订阅应用小程序,p1、p2小程序参考“第二章节”生产者异步发送消息代码,c1、c2小程序参考“第二章节”消费者集群订阅消息代码
p1-8081.jar
c1-8083.jar
p2-8082.jar
c2-8084.jar
2.通过Xshell连接到专有云ops1环境,把准备的4个jar包上传至一台16c32gECS服务器上

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

3.同时在该目录下编写启动4个jar包的start.sh脚本:
#!/bin/bash
nohup java -jar p1-8081.jar &
nohup java -jar p2-8081.jar &
nohup java -jar c1-8081.jar &
nohup java -jar c2-8081.jar &
4.编写停用4个jar包的stop.sh脚本:

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

5.编写请求消息队列2个发送和2个订阅接口的curl脚本:
#!/bin/bash
curl http://192.168.0.150:8081/echo-sync-final-send
curl http://192.168.0.150:8082/echo-sync-final-send
curl http://192.168.0.150:8083/echo-final-mq
curl http://192.168.0.150:8084/echo-final-mq
6../start.sh执行启动4个jar包,通过tail -f nohup.out查看启动日志,每个jar包启动完成日志如下:

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

7.通过ps -ef | grep jar确认4个jar是否在ECS服务器运行,有如下图则表示4个应用小程序运行正常:
JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

8../curl.sh执行请求2个消息发送和2个消息订阅接口,请求之后我们查看一下程序后台日志发现代码打印的消息发送和消息订阅的日志不停的在刷,截取单条消息发送日志如下:

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

截取单条消息订阅日志如下:

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

1.4 消息查询

如遇消息消费有问题,则可通过查询具体发送的消息内容来排查问题。消息队列 RocketMQ 版提供了三种消息查询的方式,分别是按 Message ID、Message Key 以及 Topic 查询。

1.4.1 查询方式说明

三种查询方式的特点和对比如下表所述。
表1:查询方式对比
JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

1.4.2 推荐查询过程

推荐按照以下流程查询消息。

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

1.4.3 查询步骤

1.登录MQ控制台。
2.在左侧导航栏,单击消息轨迹。
3.在消息轨迹页面,您可单击以下任一页签,然后按页面提示输入相应信息,再单击搜索按钮来查询消息。

  • 按 Message ID 查询

按 Message ID 查询消息属于精确查询,您输入 Topic 和 Message ID 即可精确查询到任意一条消息。因此,为了尽可能精确地查询,建议在发送消息成功后将 Message ID 信息打印到日志中,方便问题排查。

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

  • 按 Message Key 查询

消息队列 RocketMQ 版根据您设置的 Message Key 建立消息的索引信息,当您输入 Key 进行查询时,消息队列 RocketMQ 版根据该索引即可匹配相关的消息返回。

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

  • 按 Topic 查询

按 Topic 查询一般用在 Message ID 和 Message Key 都无法获得的情况下,根据 Topic 和消息的发送时间范围,批量获取该时间范围内的所有消息,然后再找到关心的数据。

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

4.在操作栏中单击消息详情,可查看到轨迹的简要信息,主要是消息本身的属性以及接收状态的信息。

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

5.在展开的区域中,单击查看轨迹即可查看完整的链路图。下图示例为在 TCP 协议下,按 Message ID 查询普通消息的轨迹。

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

对于 Message Key 和 Topic 查询方式,如果匹配到多条轨迹,可以进行上下翻页,查看比对轨迹数据。

1.4.4 查询结果说明

您可以在控制台的消息查询页面看到查询到的消息。直接显示的信息包含 Message ID、Tag、Key 和存储时间。此外,您还可以在每一行消息操作列下载消息内容、查询信息轨迹以及查看消息详情。
投递状态是消息队列 RocketMQ 版根据各个 Group ID 的消费进度计算出的结果,投递状态的信息如下表所示。
表 2: 消息投递状态
JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

1.4.5 消费验证

消息队列 RocketMQ 版提供了消费验证功能,该功能可以将指定消息推送给指定的在线客户端,以检测客户端消费该消息的逻辑和结果是否符合预期。
说明: 消费验证功能仅仅是用于验证客户端的消费逻辑是否正常,并不会影响正常的收消息流程,因此消息的消费状态等信息在消费验证后并不会改变。

1.5 查看消息生产数据

可供查看的消息生产数据是某个Topic在一个时间段内从Broker接收的消息的总量或者TPS。
1.登录MQ控制台。
2.在左侧导航栏,单击资源报表。
3.在资源报表页面,单击消息生产页签。
4.在Topic一栏,选择Topic,并指定其他信息,然后单击搜索。
字段说明:

  • 采集类型:分为总量和TPS。总量提供该周期内Topic接收的消息总量;TPS提供每个周期内该Topic接收消息的平均TPS。
  • 采集周期:包括1分钟、10分钟后、30分钟、1小时。采集周期决定了数据采集的时间间隔,周期越短,采集点越密集,消息消费数据越详细。
  • 时间范围:RocketMQ最多可以提供最近三天之内的消息的生产查询。

查询结果以图表的形式显示

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

1.6 查看消息消费数据

可供查看的消息消费数据是某个Topic在一个时间段内投递给某个Group ID的消息的总量或TPS。
具体操作步骤如下:
1.登录MQ控制台。
2.在左侧导航栏,单击资源报表。
3.在资源报表页面,单击消息消费页签。
4.在Group ID和Topic栏,分别选择您要查询的Group ID和Topic。
5.指定其他信息,然后单击搜索。
字段说明:

  • 采集类型:分为总量和TPS。总量提供每个周期内该Topic投递给该Group ID的消息总量,TPS提供每个周期内该Topic投递给该Group ID消息的平均TPS。
  • 采集周期:包括1分钟、10分钟后、30分钟、1小时。采集周期决定了数据采集的时间间隔,周期越短,采集点越密集,消息消费数据越详细。
  • 时间范围:RocketMQ最多可以提供最近三天之内的消息的消费查询。

查询结果以图表的形式显示

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

我们是阿里云智能全球技术服务-SRE团队,我们致力成为一个以技术为基础、面向服务、保障业务系统高可用的工程师团队;提供专业、体系化的SRE服务,帮助广大客户更好地使用云、基于云构建更加稳定可靠的业务系统,提升业务稳定性。我们期望能够分享更多帮助企业客户上云、用好云,让客户云上业务运行更加稳定可靠的技术,您可用钉钉扫描下方二维码,加入阿里云SRE技术学院钉钉圈子,和更多云上人交流关于云平台的那些事。

JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

上一篇:Visual Studio中使用Macros插件给代码添加注释、时间和以及自动脚本


下一篇:企业构建数据中台的意义