前言

上一篇小结了一下关于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异常测试的资料请关注Devmax其它相关文章!

盘点MQ中的异常测试的更多相关文章

  1. MQ的消息模型及在工作上应用场景

    这篇文章主要介绍了MQ的消息模型及在工作上应用场景,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  2. PHP使用php-resque库配合Redis实现MQ消息队列的教程

    这篇文章主要介绍了PHP使用php-resque库配合Redis实现MQ消息队列的教程,将展示php-resque的安装部署及一个Worker队列的运行过程,需要的朋友可以参考下

  3. MQ的分类组成优缺点测试点入门教程

    这篇文章主要为大家介绍了MQ的分类组成优缺点测试点入门教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. 盘点MQ中的异常测试

    这篇文章主要为大家介绍了盘点MQ中的异常测试,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  5. “init在do_boot中终止”Windows 8.1 Rabbit MQ无法启动

    如何修复终止于do_boot错误的init.我指出驱动程序的根目录下的erlang安装程序以及安全的RabbitMQ也是有效的.这很简单(见附件).我把它归结为程序文件中的空间……我花了2天的时间来解决这个问题,其他所有遇到问题的人都使用非UTF8字符集.如果我感到烦恼的话,如果问题出在erlang或RabbitMQ上,那么我会解决这个问题.

  6. centos 7.3中使能blk-mq

    scsi-mqRHEL7.2releasenote使能scsi-mq添加scsi_mod.use_blk_mq=y到内核命令行:(也可以添加dm_mod.use_blk_mq=y来使能blk-mq,减少DM层的开销)确保使能成功

  7. php – 格式化排队消息的最佳方法是什么?

    我最近一直在阅读消息排队,我想为我的应用程序实现一个简单,可扩展的系统.虽然关于设置MQ系统的主题有很多很好的信息,但我找不到很多关于实际实现的信息.我正在寻找关于如何正确格式化队列消息的模式和最佳实践,以及在PHP中执行作业的方法.我应该使用JSON,序列化对象,文本,URL还是XML?工作者是否有一个开关{}的方法,或者是否有任何已建立的模式来实现工人?

  8. RocketMQ在windows环境下的安装

    成功后会弹出提示框,此框勿关闭。打开runbroker.cmd,然后将‘%CLAsspATH%’加上英文双引号。保存并重新执行start语句。三.RocketMQ插件部署1.下载地址:https://github.com/apache/rocketmq-externals.git如果下载失败把https://github.com/apache/rocketmq-externals.git的https换成git就ok我的就是下载完成之后,进入‘rocketmq-externals\rocketmq-cons

  9. delphi客户端连接IBM MQ

    总结以上是DEVMAX为你收集整理的delphi客户端连接IBMMQ全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  10. delphi for MQ 【终极教程一】 认识如何控制MQ

    总结以上是DEVMAX为你收集整理的delphiforMQ认识如何控制MQ全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部