当前位置:网站首页>【软件测试】盘一盘工作中遇到的 MQ 异常测试
【软件测试】盘一盘工作中遇到的 MQ 异常测试
2022-07-23 09:01:00 【把苹果咬哭的测试笔记】
上一篇小结了一下关于redis的异常测试,今天再来盘一盘 MQ 相关的。
MQ 跟 redis 一样,也是现在系统服务中不可或缺的重要中间件,通常用来流量削峰、应用解耦、异步处理等。
之前有过一篇整理【MQ 快速入门】介绍、分类、组成、优缺点、测试点,有兴趣也可以跳过去看看。
日常经手的系统主要用的是 RocketMQ,是阿里系下开源的一款分布式、队列模型的消息中间件,是阿里参照kafka设计思想使用java实现的一套MQ,并做了自己的改进。被广泛的应用在订单、交易、充值、流计算、消息推送、日志流处理等场景。
这里再简述一些知识点。
一、RocketMQ 消息模式
RocketMQ中,也存在两种消息模式,分别为集群消费模式和广播消费模式。
集群消费模式
RocketMQ默认的消息模式就是集群模式,当存在多个消费者时,消息通过一定负载均衡策略,将消息分发到多个consumer中。
比如现在有3个消费者,那么一条消息投递过来,只会被consumer 1、consumer 2、consumer 3中的一个消费。
在RockeMQ中,通过ConsumeGroup的机制,实现了天然的消息负载均衡,可以非常方便的通过加机器来实现水平扩展。
广播消费模式
这种模式下,会把消息分发给每一个消费者。一条消息投递过来,会被 consumer 1、consumer 2、consumer 3都消费一次,就像发了条朋友圈,你的朋友都可以看见。
目前我们用的比较多的是集群模式,在集群模式也可以模拟广播消费。
二、push 和 pull 优缺点
对于任何一款消息中间件而言,消费者客户端一般有两种方式从消息中间件获取消息并消费。
Pull方式
由消费者客户端主动向消息中间件(MQ消息服务器代理)拉取消息。
适用场景:对于生产者生产消息数据比较大时,而消费端处理比较复杂,消费能力相对较低。
优点:消费者可以依据自己的消费能力进行消费,生产者不需要维护和消费者之间的会话。
缺点:拉取消息的间隔不太好设置。间隔太短,对服务器请求压力过大。间隔时间过长,那么必然会造成一部分数据的延迟,实时性相对较低。
优化方案:
长轮询的消费方式,需要Server和Client的配合才能够实现。
即Client发送消息请求,Server端接受请求,如果发现Server队列里没有新消息,Server端不立即返回,而是持有这个请求一段时间(通过设置超时时间来实现),在这段时间内轮询Server队列内是否有新的消息,如果有新消息,就利用现有的连接返回消息给消费者;如果这段时间内没有新消息进入队列,则返回空。
长轮询的弊端:在持有消费者请求的这段时间,占用了系统资源,因此长轮询适合客户端连接数可控的业务场景中。
Push方式
由消息服务端主动地将消息推送给消费者,尽可能实时地将消息发送给消费者进行消费。
适用场景:对于数据实时性要求高的场景。
优点:生产者主动推送给消费者,及时性很高。
缺点:当消费者消费能力远低于生产者生产能力,那么一旦生产者推送大量消息到消费者时,就会导致消费者消息堆积,处理缓慢,甚至服务崩溃。
另外,生产者需要维护和每个消费者之间的会话。
优化方案:不采用 http 长连接的方法保持会话,采用 socket 监听。
三、刷盘策略
RocketMQ的存储读写是基于JDK NIO的内存映射机制的,消息存储时首先将消息追加到内存中,再根据不同的刷盘策略在不同的时间进行刷盘。
同步刷盘
同步刷盘是指数据到达内存之后,必须刷到commitlog日志之后才算成功,然后返回producer数据已经发送成功。
异步刷盘
指数据到达内存之后,返回producer说数据已经发送成功,然后再写入commitlog日志。
什么是commitlog?
commitlog 就是来存储所有的元信息,包含消息体,类似于Mysql、Oracle 的 redolog。所以只要有 CommitLog 在,Consume Queue即使数据丢失,仍然可以恢复出来。
而 consumequeue,就是用来记录数据的位置,以便 Consumer 快速通过 consumequeue 找到 commitlog 中的数据。
四、MQ 异常测试
MQ消息体
MQ消息体中某些必填参数为 NULL,或者全部必填都为NULL,字段类型、长度是否不符合约定等。
消息重复发送
消息重复发送,只消费一条,一般根据消息内容中唯一标识来去重。
消息到达顺序不一致
消息到达顺序不一致,导致业务异常。
比如:订单下单后再取消,如果先收到取消的消息,再收到下单消息,就会有问题。
消息发送失败重试
Producer端重试
比如网络抖动导致生产者发送消息到MQ失败,可以手动设置发送失败重试的次数。
Consumer端重试
默认16次,重试时间间隔会越来越长,如果失败的多,容易堆积。这里的重试次数可自定义设置。
值得注意的是,只有消息推送失败才需要重推,不要把其他失败的情况也进行重试。
接线上生产者
接线上已有的生产者,需要注意,必须设置消费开始时间,不然上线时会大批量消息过来会造成堆积,可能造成故障。
消息丢失
消息丢失,业务是否兼容,是否有补偿或者监控机制。
消息争用
如果是集群模式,同一topic下新增新的消费组,但是没有申请新的group,导致一条消息投递过来,多个消费组争抢。
比如开发为了省事,预发和线上同一个topic,消费组的group也一样,上线后,可能存在有效消息被预发消费组消费了。
MQ比落库快
比如某接口A,新增一条数据后会同步更新DB和发送MQ给服务B,服务B收到消息后查询DB这条数据。曾经发现了收到消息却查不到数据的情况,因为数据库更新速度没有MQ快,后来改成异步了。
边栏推荐
- npm warn config global `--global`, `--local` are deprecated. use `--location=global` instead.
- Fabric. JS basic brush
- Authing supports Zadig! Unified authentication and rapid docking of cloud native users
- 解决使用bert encoder出现的一系列问题
- 4. 寻找两个正序数组的中位数
- C language implementation of classroom random roll call system
- The win11 installation system prompts that VirtualBox is incompatible and needs to uninstall the solution of virtual, but the uninstall list cannot find the solution of virtual
- 在使用 VScode 进行代码格式化后,保存发现代码又变乱了,怎么办?vs去掉格式化
- Aruba学习笔记05-配置架构- WLAN配置架构
- 动态规划-- 背包问题
猜你喜欢

Spotlight light box JS plug-in full screen enlarged picture

Authing 支持 Zadig 啦!云原生用户统一认证快速对接

The win11 installation system prompts that VirtualBox is incompatible and needs to uninstall the solution of virtual, but the uninstall list cannot find the solution of virtual

利用js自动解析执行xss

10 years of software testing engineer experience, very confused

R语言实战应用案例:绘图篇(三)-多种组合图型绘制

Authing supports Zadig! Unified authentication and rapid docking of cloud native users

【C语言】猜数字小游戏+关机小程序

工作小记:一次抓包

【FLink】FLink Hash collision on user-specified ID “opt“. Most likely cause is a non-unique ID
随机推荐
Summary of JS data type judgment methods
Summary of different circulation modes and precautions in JS
C语言项目实战:24点游戏计算器(基于结构体、指针、函数、数组、循环等知识点)
npm warn config global `--global`, `--local` are deprecated. use `--location=global` instead.
First acquaintance and search set
webstrom ERROR in [eslint] ESLint is not a constructor
How do FPGA engineers design complex systems?
[pyqt5 installation and use]
2022河南萌新联赛第(二)场:河南理工大学 补题题解
扁平样式反馈表单页面
Canvas from getting started to persuading friends to give up (graphic version)
Right click to create a new TXT. The new text file is missing. You can solve it by adding a registry. Find the ultimate solution that can't be solved
利用js自动解析执行xss
【附下载】值得收藏的几款渗透测试常用的脚本
c语言实现strcmp、strstr、strcat、strcpy
Spotlight light box JS plug-in full screen enlarged picture
R language practical application case: drawing part (III) - drawing of multiple combination patterns
云呐|公司固定资产如何管理?公司固定资产如何管理比较好?
CAN总线快速了解
js日历样式饼图统计插件