上一篇小结了一下关于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快,后来改成异步了。

【软件测试】盘一盘工作中遇到的 MQ 异常测试相关推荐

  1. 我来更新了,说说工作中的Java处理异常

    背景 本周二的一个线上小事故,不过如果说是事故,也有点过于的夸张了,只是代码的异常处理不到位,将异常层层的抛给了最上层的拦截器,然后在日志中对于一些错误的调用报出异常错误,不过问题不大,经过评估,只针 ...

  2. 日常工作中,软件测试人员如何避免“背锅”

    作为一名软件测试工程师,日常工作中最常打交道的肯定就是开发和产品经理.有沟通就会问题,有问题难免会有争执.那么你肯定听过这些话: "这么弱智的bug你都测不出来吗?" " ...

  3. bec初级第一课_在您的第一个初级开发人员工作中如何生存和发展

    bec初级第一课 Landing your first junior developer job is an amazing accomplishment. You've worked really ...

  4. 我对测试工作的一些认识(资深测试人员总结)

    不知不觉在软件测试行业,野蛮生长了10年之久.这一路上拥有了非常多的感受.有迷茫,有踩过坑,有付出有收获, 有坚持! 我一直都在软件测试行业奋战, 毕业时一起入职的好友已经公司内部转岗,去选择了更适合 ...

  5. 检查坏道右键单击盘符/属性/工具中的查错。

    检查坏道右键单击盘符/属性/工具中的查错. 7.windowsXP系统经常出现错误提示 答:XP系统经常提示是否将错误报告发送到微软公司,有两个选项:发送或不发送,关闭的方法依此是: 进入:开始菜单- ...

  6. 在linux系统中使用WoeUSB工具制作U盘启动盘

    这里写目录标题 用WoeUSB在Linux上制作Win10启动盘 安装WoeUSB 制作U盘启动盘 附录:常见问题 用WoeUSB在Linux上制作Win10启动盘 工作中有时需要配置Windows的 ...

  7. 开源企业网盘选型(完善中)

    开源企业网盘选型 一.概述 1.1 什么是网盘 1.2 为什么需要网盘 1.3 网盘的应用场景 二.主流网盘(个人观点.排名不分先后) 1.dboxshare 主要功能特点 2.Nextcloud 2 ...

  8. u盘运行的linux系统软件,在linux系统中,有什么软件可以做U盘开启盘

    制作启动U盘的软件比较多:U速启U盘启动盘制作工具.一键U盘启动盘制作工具.绿叶U盘启动盘制作工具.USBOOT启动盘制作工具. 下面以USBOOT软件制作启动U盘为例,介绍启动U盘的制作方法,具体步 ...

  9. android tf卡及u盘_在Android中读写U盘

    原文链接:https://www.zybuluo.com/Tyhj/note/1144629 最近工作中遇到数据从U盘导出的功能,网上找了一下,有个开源的框架可以拿来使用,U盘和内存卡什么的不一样,是 ...

最新文章

  1. 自动化生成 Openstack 新项目开发框架
  2. python三十一:random模块
  3. 亚马逊手机端测评软件/PC端测评软件各有什么优缺点?
  4. MybatisPlus学习(四)条件构造器Wrapper方法详解
  5. mysql 根据当前时间戳_mysql timestamp类型 根据当前时间戳更新
  6. python 二维数组长度_剑指offer二维数组中的查找【Java+Python】
  7. sql checksum_SQL Server中的CHECKSUM页面验证
  8. 用GZIP来压缩socket传输的序列化的类
  9. xml文件和DataTable之间相互转换
  10. c语言程序设计徐立辉答案,C语言程序设计实验及习题指导
  11. mysql-front 8.0_使用SQL-Front启动MySQL8.0报错
  12. 能否被2整除引发的思考
  13. 我的Android进阶之旅------Android通过调用Webservice实现天气预报
  14. 以计件积分为纽带-探索客户中心团队再造模式
  15. 北京尚学堂退课退课,口碑还不错
  16. Unity3D学习笔记(6)—— 飞碟射击游戏
  17. java 咖啡 典故,探秘咖啡的神秘起源
  18. 核高基专家许洪波:HTML5将赢得移动设备未来
  19. 做软件的和搞硬件的,谁更优越?程序员:感觉搞硬件的真厉害,年龄越大越吃香,软件是吃青春饭...
  20. Git使用教程:完全图解!

热门文章

  1. 【面试总结】Unity3D面试题总结
  2. java.lang.IllegalStateException: response alrea...
  3. 我有一个梦想,希望每一位提到算法的人,不再立即紧皱眉头
  4. 如何批量将多个 PPT 文档中的图片提取出来
  5. 计算机少年宫辅导教师总结,学校信息技术教师的个人工作总结
  6. FineReport填报--批量删除
  7. 数据中心趋势:提高功率密度
  8. JS数组Arry 操作方法速记
  9. 【物联网】AT指令|AT返回错误|AT 指令 收发短信和GPRS上网 SIM508/548
  10. 【报告分享】 2020年汽车产销数据及汽车工业运行情况-中国汽车工业协会(附下载)