常见的中间件--消息队列中间件测试点

最近刷题,看到了有问中间件的题目,于是整理了一些中间件的知识,大多是在小破站上的笔记,仅供大家参考~

主要分为七个部分来分享:

一、常见的中间件

二、什么是队列?

三、常见消息队列MQ的比较

四、队列的优点和缺点

五、消息队列的原理

六、为什么使用消息队列?

七、队列的测试点

八、高频软件测试面试题

一、常见的中间件

Redis:缓存中间价

MQ:消息队列中间件

Nginx:Web服务器中间件

二、什么是队列?

队列(Queue)是一种常见的数据结构,用于按照先进先出(FIFO,First In First Out)的原则管理元素。这意味着最先被添加到队列的元素将首先被移除。队列的操作通常包括两个主要动作:入队(Enqueue)和出队(Dequeue) 。

三、常见消息队列MQ的比较

ActiveMQ:比较老,一般不用了

RabbitMQ:大部分公司够用了,除非像阿里并发那么大的公司

RocketMQ:阿里在用的

Kafka:主要用于记录日志,例如淘宝的足迹功能

四、队列的优点和缺点

1、优点

解耦

异步

流量削峰填谷

2、缺点

用性低

复杂度

一致性问题(例如消息丢失,消息重复等等,导致两个系统数据不一致)

五、消息队列的原理

下面以用户下单这个场景为例,分享下整个过程:

一)生产者如何将消息可靠投递到消息队列(MQ):

  1. 客户端发送消息到消息队列MQ。
  2. 消息队列MQ将消息进行持久化,并向客户端发送 Ack 消息。由于网络问题可能导致 Ack 消息无法及时发送至客户端,因此客户端在等待一段超时时间后,会重新传送消息。
  3. 客户端在收到 Ack 消息后,确认消息已被成功投递。

二) 消息队列如何将消息可靠投递给消费者:

  1. 消息队列MQ将消息推送给客户端(或者客户端通过拉取方式获取消息)。
  2. 客户端接收并完成业务逻辑处理。
  3. 客户端向消息队列MQ发送 Ack 消息,通知消息队列删除该消息。由于网络问题可能导致 Ack 失败,客户端会收到重复的消息,从而引发了消费幂等性的问题。
  4. 消息队列删除已被成功消费的消息。

六、为什么使用消息队列?

主要用于解耦、异步、流量削峰填谷。

1、解耦

如果不加中间件MQ,订单系统直接调用库存系统,当库存系统出现故障时,用户就会下单失败。加了中间件之后,就不会出现下单失败了,用户下单之后,把订单id传给MQ,监控系统发现库存系统挂了之后,立马修复,最后还是可以下单成功。

2、异步

如果不加中间件MQ,下单的时候,订单系统会同步调用库存系统,有了MQ之后,下单后,订单系统只要把订单id传给MQ即可。

3、流量削峰填谷

例如B是订单系统,C是库存系统,C系统每分钟只能承受1W的并发,现在突然有30W的并发,那先把订单消息发送给MQ,C系统从MQ拉取信息,处理速度还是每分钟1W,最后花费30分钟来处理,用时间换空间。

七、队列的测试点

一)正向的业务逻辑测试

1、数据正确性

产者推送消息,消费者能正常消费信息,比如消息发送的字段以及接收的字段有无缺失,且保持一致

2、时序

不同时序推送消息,先后顺序是否与预期一致。

注意队列优先级,可使用事务解决

二)反向的异常测试

1、消息推送失败是否有重试

如因为网络原因导致的消息丢失,是否有补发和重试机制(用定时任务跑),通常情况下Produce会设置补发。

2、避免重复消息

例如生产者重复推送同一条数据,由于RocketMQ天生就有消息重复发送的机制,所以当产生消息重新发送时,如何对此问题进行处理?通常情况下要对消费端的服务做幂等处理,数据库里添加唯一索引,保证消息不被重复消费。

三)性能测试(消费积压)

主要就是通过性能测试,看看在高并发访问的情况下,系统正确处理消息的能力,是否会出现消息队列拥堵,宕机等情况。

解决消费积压的办法:

  1. 首先要快速解决消息积压问题,比如加大consumer消费数量,消费频次;
  2. 临时紧急扩容,比如临时征用10倍的机器来部署consumer程序,这个程序部署上去消费积压的数据,等快速消费完积压数据之后,得恢复原先部署架构,重新用原先的consumer机器来消费消息。

八、高频软件测试面试题

1、如何保证消息不丢失?

消息队列将收到的消息持久化到磁盘中,以保证消息队列异常或重启的情况下,消息不会丢失

2、消息队列的工作原理是什么?

生产者创建消息并将其发送到消息队列, 消费者从消息队列中接收消息,并异步地处理这些消息, 消费者在成功处理消息后向消息队列发送确认(Acknowledge)消息,通知队列可以删除已处理的消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/206773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12_企业架构之Tomcat部署使用

Tomcat 学习目标和内容 1、能够描述Tomcat的使用场景 2、能够简单描述Tomcat的工作原理 3、能够实现部署安装Tomcat 4、能够实现配置Tomcat的service服务和自启动 5、能够实现Tomcat的Host的配置 6、能够实现Nginx反向代理Tomcat 7、能够实现Nginx负载均衡到Tomcat 一、Tomcat介…

linux的定时任务Corntab

安装crontab # yum安装crontab yum install -y crontab# 开机自启crond服务并现在启动 systemctl enable --now crondcron系统任务调度 系统任务调度: 系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。 在/etc/crontab文件,这…

机器学习之全面了解回归学习器

我们将和大家一起探讨机器学习与数据科学的主题。 本文主要讨论大家针对回归学习器提出的问题。我将概要介绍,然后探讨以下五个问题: 1. 能否将回归学习器用于时序数据? 2. 该如何缩短训练时间? 3. 该如何解释不同模型的结果和…

No suitable driver found for jdbc:mysql://localhost:3306(2023/12/7更新)

有两种情况: 压根没安装下载了但没设为库或方法不对 大多数为第一种情况: 一. 下载jdbc 打开网址选择一个版本进行下载 https://nowjava.com/jar/version/mysql/mysql-connector-java.html 二.安装jdbc 在项目里建一个lib文件夹 在把之前下载的jar文…

优化 SQL 日志记录的方法

为什么 SQL 日志记录是必不可少的 SQL 日志记录在数据库安全和审计中起着至关重要的作用,它涉及跟踪在数据库上执行的所有 SQL 语句,从而实现审计、故障排除和取证分析。SQL 日志记录可以提供有关数据库如何访问和使用的宝贵见解,使其成为确…

JNPF低代码平台详解 -- 系统架构

目录 一、技术介绍 技术架构 二、设计原理 三、界面展示 1.代码生成器 2.工作流程 3.门户设计 4.大屏设计 5.报表设计 6.第三方登录 7.多租户实现 8.分布式调度 9.消息中心 四、功能框架 JNPF低代码是一款新奇、实用、高效的企业级软件开发工具,支持企…

Qt/C++音视频开发58-逐帧播放/上一帧下一帧/切换播放进度/实时解码

一、前言 逐帧播放是近期增加的功能,之前也一直思考过这个功能该如何实现,对于mdk/qtav等内核组件,可以直接用该组件提供的接口实现即可,而对于ffmpeg,需要自己处理,如果有缓存的数据的话,可以…

Rust的eBFP框架Aya(一) - Linux内核网络基础

前言 在我的Rust入门及实战系列文章中已经说明, Rust是一门内存安全的高性能编程语言,从它的这些优秀特性来看,就是一门专为系统开发而诞生的语言。至于很多使用Rust来进行web开发的行为,不能说它们不好,只能说是杀鸡…

2017下半年软工(桥接模式)

题目——桥接模式(抽象调用实现部分) package org.example.桥接模式;/*** 桥接模式的核心思想是将抽象部分与它的实现部分分离,使它们可以独立变化,就是说你在实现部分:WinImp、LinuxImp基础上还能加上RedHatImp&#…

uniapp 输入框输入时,会将内容顶上去的解决方案

// 设置页面最小高度 export const setPageMinHeight () > {return {position: relative,min-height: uni.getSystemInfoSync().windowHeight px} }页面使用: import {setPageMinHeight} from "/utils/uniUtil";data() {return {minHeight: setPag…

Unity 状态系统

状态系统 原理食用方法Demo 原理 #mermaid-svg-lUbxJ8eMP3KqrEhY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lUbxJ8eMP3KqrEhY .error-icon{fill:#552222;}#mermaid-svg-lUbxJ8eMP3KqrEhY .error-text{fill:#55…

官方officevisio在线安装包

在线安装包,在线就是要有网络环境,你能搜到这篇博客,就初步具备网络环境 visio在线安装包.zip官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 在线安装包如下,双击执行安装即可,可供选择的64/32位 软件的激活与…

【扩散模型】ControlNet从原理到实战

ControlNet从原理到实战 ControlNet原理ControlNet应用于大型预训练扩散模型ControlNet训练过程ControlNet示例1 ControlNet与Canny Edge2. ControlNet与Depth3. ControlNet与M-LSD Lines4. ControlNet与HED Boundary ControlNet实战Canny Edge实战Open Pose 小结参考资料 Cont…

Linux系统上RabbitMQ安装教程

一、安装前环境准备 Linux:CentOS 7.9 RabbitMQ Erlang 1、系统内须有C等基本工具 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc xz socat2、下载安装包 1)首先&a…

[linux] kaggle 数据集用linux下载

你可以通过以下步骤获取Kaggle的下载链接并在Linux中进行下载: 首先,确保你已经安装了Python和Kaggle API。如果没有安装,你可以通过以下命令安装: pip install kaggle 接着,你需要在Kaggle网站上获取API Token。登录…

【PyTorch】 暂退法(dropout)

文章目录 1. 理论介绍2. 实例解析2.1. 实例描述2.2. 代码实现2.2.1. 主要代码2.2.2. 完整代码2.2.3. 输出结果 1. 理论介绍 线性模型泛化的可靠性是有代价的,因为线性模型没有考虑到特征之间的交互作用,由此模型灵活性受限。泛化性和灵活性之间的基本权…

Docker构建自定义镜像

创建一个docker-demo的文件夹,放入需要构建的文件 主要是配置Dockerfile文件 第一种配置方法 # 指定基础镜像 FROM ubuntu:16.04 # 配置环境变量,JDK的安装目录 ENV JAVA_DIR/usr/local# 拷贝jdk和java项目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo…

Java基础50题: 21.实现一个方法printArray, 以数组为参数,循环访问数组中的每个元素,打印每个元素的值.

概述 实现一个方法printArray, 以数组为参数,循环访问数组中的每个元素,打印每个元素的值. 代码 public static void printArray(int[] array) {for (int i 0; i < array.length; i) {System.out.println(array[i] " ");}System.out.println();}public static…

【日常总结】mybatis-plus WHERE BINARY 中文查不出来

目录 一、场景 二、问题 三、原因 四、解决方案 五、拓展&#xff08;全表全字段修改字符集一键更改&#xff09; 准备工作&#xff1a;做好整个库备份 1. 全表一键修改 Stage 1&#xff1a;运行如下查询 Stage 2&#xff1a;复制sql语句 Stage 3&#xff1a;执行即可…

100. 相同的树(Java)

目录 解法&#xff1a; 官方解法&#xff1a; 方法一&#xff1a;深度优先搜索 复杂度分析 时间复杂度&#xff1a; 空间复杂度&#xff1a; 方法二&#xff1a;广度优先搜索 复杂度分析 时间复杂度&#xff1a; 空间复杂度&#xff1a; 给你两棵二叉树的根节点 p 和…