我的编程空间,编程开发者的网络收藏夹
学习永远不晚

盘点MQ中的异常测试

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

盘点MQ中的异常测试

前言

上一篇小结了一下关于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中的异常测试的详细内容,更多关于MQ异常测试的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

盘点MQ中的异常测试

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP异常处理:在测试场景中使用断言异常

使用断言异常可以方便地在php测试框架中断言异常,通过expectexception()方法声明期望抛出的异常类型,若确实发生则测试通过,否则失败。使用断言异常提高了测试用例的稳定性和可维护性,尤其适用于预期发生异常的情况。PHP 异常处理
PHP异常处理:在测试场景中使用断言异常
2024-05-14

Web测试中的UI测试详解:容易忽略的14个测试点汇总

有软件的地方就有界面,就会有界面测试。界面测试是软件测试中,最多,最繁琐,最简单的测试。尤其在本地化测试(多国语言测试)中,有很多的界面测试。用户界面测试简称UI测试,测试用户界面的功能模块的布局是否合理,整体风格是否一致和各个控件的放置位
2023-06-05

C#中常见的测试框架和单元测试问题

C#中常见的测试框架和单元测试问题,需要具体代码示例引言:在软件开发过程中,测试是一个至关重要的环节。通过测试,我们可以确保代码的质量和稳定性,提高应用程序的可靠性和可维护性。C#是一种广泛应用于软件开发的编程语言,因此需要了解C#中常见的
2023-10-22

Go 中异步函数的单元测试方法

在 go 中,异步函数可以通过并发测试进行单元测试,以模拟并发执行并测试异步函数的行为。步骤如下:创建一个超时上下文。创建一个通道来接收结果。调用异步函数并将结果写入通道。从通道中读取结果并检查预期值。使用 select 语句处理超时或接收
Go 中异步函数的单元测试方法
2024-05-01

由于先前的测试用例失败而引发断言异常

欢迎各位小伙伴来到编程网,相聚于此都是缘哈哈哈!今天我给大家带来《由于先前的测试用例失败而引发断言异常》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也
由于先前的测试用例失败而引发断言异常
2024-04-04

Java中的异常和处理知识点总结

这篇文章主要介绍“Java中的异常和处理知识点总结”,在日常操作中,相信很多人在Java中的异常和处理知识点总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的异常和处理知识点总结”的疑惑有所帮助!
2023-06-17

Python CPython 中的异常处理与调试技巧

理解 Python CPython 中的异常处理和调试技巧对于高效开发和问题解决至关重要。本文将深入探讨异常处理、调试工具和技巧,以帮助你提升 Python 编码能力。
Python CPython 中的异常处理与调试技巧
2024-03-04

Java中关于异常的知识点有哪些

本文小编为大家详细介绍“Java中关于异常的知识点有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中关于异常的知识点有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。3W原则哪都有的3W原则,JA
2023-06-16

Python中异常重试的解决方案详解

前言 大家在做数据抓取的时候,经常遇到由于网络问题导致的程序保存,先前只是记录了错误内容,并对错误内容进行后期处理。原先的流程:def crawl_page(url):passdef log_error(url):passurl = ""
2022-06-04

自动化测试:盘点Selenium页面元素定位的8种方法

前段时间因项目需要,学习Selenium进行自动测试。现在总结整理下Selenium中元素定位的方法,希望可以帮助一些有疑问的朋友。自动化测试步骤 :定位元素→操作元素→验证操作结果→记录测试结果在自动化测试过程中,测试程序通常的操作页面元
2023-06-05

PHP 中基于 Elasticsearch 的异常检测与预警系统

引言:异常检测与预警系统在现代软件开发中起着至关重要的作用。它能够帮助开发人员及时发现和解决潜在的问题,提升系统的稳定性和可靠性。在本文中,我们将介绍如何使用 PHP 结合 Elasticsearch 实现异常检测与预警系统,并提供代码示例
2023-10-21

C++ 技术中的异常处理:异常传播机制的原理和要点是什么?

异常传播机制:当一个函数发生异常时,它会向上层函数传播,直到被捕获或继续传播。要点:1)异常抛出通过 throw 实现;2)捕获异常使用 try-catch 块;3)重新传播异常使用 rethrow。C++ 异常处理中的异常传播机制:原理和
C++ 技术中的异常处理:异常传播机制的原理和要点是什么?
2024-05-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录