《2025年软件测试工程师面试》消息队列面试题
消息队列
基本概念
- 消息队列是一种先进先出(FIFO)的数据结构,它允许一个或多个消费者从队列中读取消息,也允许一个或多个生产者向队列中发送消息。消息在被消费之前会一直保留在队列中,这样可以确保消息的可靠传递。
工作原理
- **生产者 - 消费者模式** :生产者将消息发送到消息队列,消费者从消息队列中获取消息进行处理。生产者和消费者之间不需要直接交互,它们通过消息队列进行解耦。
- **消息传递过程** :生产者创建消息并将其发送到消息队列。消息队列接收消息并将其存储起来。消费者从消息队列中获取消息并进行处理。消费者处理完消息后,会向消息队列发送一个确认消息,表示该消息已经被成功处理。
主要特点
- **异步通信** :消息队列允许生产者和消费者异步地进行消息的发送和接收,这样可以提高系统的并发性和响应速度。
- **解耦** :消息队列可以将生产者和消费者解耦,使得它们可以独立地进行开发、部署和扩展。
- **可靠性** :消息队列通常具有可靠的消息传递机制,可以确保消息不会丢失、重复或损坏。
常见的消息队列架构模式
- **点对点(Point - to - Point)模式** :在这种模式下,一个消息只能被一个消费者消费。生产者将消息发送到一个特定的队列,消费者从该队列中获取消息进行处理。
- **发布 - 订阅(Publish - Subscribe)模式** :在这种模式下,一个消息可以被多个消费者消费。生产者将消息发送到一个主题,消费者订阅该主题,当有新的消息发布到该主题时,所有订阅该主题的消费者都会收到该消息。
应用场景
- **异步处理** :当一个任务的处理过程比较耗时,且不需要立即得到结果时,可以使用消息队列将该任务异步处理。例如,在一个电商系统中,当用户下单后,可以将订单信息发送到消息队列,然后由后台系统异步处理订单,这样可以提高系统的响应速度。
- **系统解耦** :当两个系统之间需要进行交互,但又不想直接耦合在一起时,可以使用消息队列进行解耦。例如,在一个微服务架构中,不同的微服务之间可以通过消息队列进行通信,这样可以降低系统的耦合度。
- **流量削峰** :当系统的流量突然增大,超过了系统的处理能力时,可以使用消息队列进行流量削峰。例如,在一个秒杀系统中,当秒杀活动开始时,大量的用户请求会同时到达服务器,这时可以将请求发送到消息队列,然后由后台系统按照一定的速度从消息队列中取出请求进行处理,这样可以避免服务器被瞬间的高流量压垮。
- **日志处理** :可以使用消息队列将系统的日志信息发送到日志处理系统进行处理。例如,在一个分布式系统中,各个节点的日志信息可以通过消息队列发送到日志收集器,然后由日志收集器将日志信息存储到日志数据库中。
- **分布式事务** :在分布式系统中,可以使用消息队列来实现分布式事务。例如,在一个分布式数据库系统中,当需要在多个数据库节点上执行事务操作时,可以使用消息队列来协调各个节点的操作,确保事务的原子性和一致性。
常见的消息队列产品
- **RabbitMQ** :一种开源的消息队列软件,支持多种消息队列协议,如 AMQP、STOMP、MQTT 等。
- **Kafka** :一种高吞吐量、可扩展的消息队列系统,适用于处理大量的实时数据。
- **ActiveMQ** :一种开源的消息队列软件,支持多种消息队列协议,如 JMS、AMQP、STOMP 等。
- **RocketMQ** :一种开源的消息队列软件,具有高可用性、高吞吐量、低延迟等特点,适用于大规模分布式系统。
说说你们项目里是怎么用消息队列的?
为什么使用消息队列?
解耦
异步
削峰
消息队列的优点和缺点
- 系统可用性降低:系统引入的外部依赖越多,越容易挂掉,本来你就是 A 系统调用 BCD 三个系统接口就好了,人家 ABCD 四个系统好好的,没啥问题,这个时候却加入了 MQ 进来,万一 MQ 挂了怎么办? MQ 挂了整套系统也会崩渍了。
- 系统复杂性提高:硬生生加个 MQ 进来,你怎么保证消息没有重复消费? 怎么处理消息丢失的情况? 怎么保证消息传递的顺序性?
- 一致性问题: A 系统处理完了直接返回成功了,人都以为你的请求成功了,但是问题是,要在 BCD 三个系统中,BD 两个系统写库成功了,结果 C 系统写虚失败了,这样就会存在数据不一致的问题,
如何保证消息队列的高可用?
普通集群模式
• 意思就是在多台机器上启动多个 RabbitMQ 实例,每台机器启动一个,但是创建的 Queue,只会放在一个 RabbitMQ 实例上,但是每个实例都同步 queue元数据,在消费的时候,实际上是连接到另外一个实例上,那么这个实例会从queue 所在实例上拉取数据过来,这种方式确实很麻烦,也不怎么好,没做到所谓的分布式 ,就是个普通集群。因为这导致你要么消费每次随机连接一个实例,然后拉取数据,要么固定连接那个 queue 所在实例消费数据,前者有数据拉取的开销,后者导致单实例性能瓶颈。
如何保证消息不被重复消费?如何保证消息消费时的幂等性?
- 比如数据要写库,首先根据主键查一下,如果这个数据已经有了,那就别插入了,执行 update 即可。
- 如果用的是 redis,那就没问题了,因为每次都是 set 操作,天然的幂等性。
- 如果不是上面的两个场景,那就做的稍微复杂一点,需要让生产者发送每条消息的时候,需要加一个全局唯一的 id,类似于订单 id 之后的东西,然后你这里消费到了之后,先根据这个 id 去 redis 中查找,之前消费过了么,如果没有消费过,那就进行处理,然后把这个 id 写入到 redis 中,如果消费过了,那就别处理了,保证别重复消费相同的消息即可。
- 还有比如基于数据库唯一键来保证重复数据不会重复插入多条,我们之前线上系统就有这个问题,就是拿到数据的时候,每次重启可能会重复,因为 Kafka消费者还没来得及提交 offset,重复数据拿到了以后,我们进行插入的时候,因为有了唯一键约束了,所以重复数据只会插入报错,不会导致数据库中出现脏数据。
如何保证消息传输不丢失?
- 第一个是创建 queue 的时候,将其持久化的,这样就保证了 RabbitMQ 持久化 queue 的元数据,但是不会持久化 queue 中的数据
- 第二个就是发送消息的时候,将消息的 deliveryMode 设置为 2,就是将消息设置为持久化的,此时 RabbitMQ 将会将消息持久化到磁盘上,必须同时设置两个持久化才行,哪怕是 Rabbit 挂了,也会从磁盘中恢复 queue 和 queue 中的数据。而且持久化可以跟生产者那边的 confirm 机制配置起来,只有消息被持久化到磁盘后,才会通知生产者 ACK 了,所以哪怕是在持久化磁盘之前,RabbitMQ 挂了,数据丢了,生产者收不到 ACK,你也是可以自己重发的。
如何保障消息的顺序性?
死信
死信队列 是什么?
死信队列的应用场景
- **错误消息的重试与恢复**:当消息因消费者代码错误或外部系统不可用而无法处理时,可将它们发送到死信队列,然后通过专门的消费者进行重试或人工干预。
- **异常消息的分析与监控**:通过监控死信队列中的消息,可以及时发现系统中的问题,如消费者代码中的逻辑错误或外部系统的不可用状态。
- **消息过期处理**:对于设置了TTL(Time To Live)的消息,如果它们在指定的时间内未被消费,将被发送到死信队列,以便进行过期处理。
- **消息审计与合规性检查**:将无法通过审计或合规性检查的消息发送到死信队列,可以确保只有符合要求的消息被进一步处理。
- **消息路由与分流**:在复杂的消息系统中,使用死信队列作为中间环节,可以实现更灵活的消息路由和分流策略。
- **消息备份与恢复**:将重要消息发送到死信队列(作为备份队列),可以在系统发生故障或数据丢失时进行恢复。
相关文章:
《2025年软件测试工程师面试》消息队列面试题
消息队列 消息队列(Message Queue,简称 MQ)是一种应用程序之间的通信方法。 基本概念 消息队列是一种先进先出(FIFO)的数据结构,它允许一个或多个消费者从队列中读取消息,也允许一个或多个生产者…...
大数据学习(55)-BI工具数据分析的使用
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
原生android 打包.aar到uniapp使用
1.原生安卓里面引入uniapp官方提供的包文件: uniapp-v8-release.aar 2.提供uniapp调用的接口,新建类文件继承UniModule, package com.dermandar.panoramal;import com.scjt.lib.certlib;import io.dcloud.feature.uniapp.annotation.UniJSM…...
解锁MacOS开发:环境配置与应用开发全攻略
✨✨✨这里是小韩学长yyds的BLOG(喜欢作者的点个关注吧) ✨✨✨想要了解更多内容可以访问我的主页 小韩学长yyds-CSDN博客 目录 引言 一、MacOS 开发环境配置 (一)必备工具安装 (二)集成开发环境(IDE)选…...
Aruco 库详解:计算机视觉中的高效标记检测工具
1. 引言:Aruco 在计算机视觉中的重要性 在计算机视觉领域,标记(Marker)检测和识别是许多应用的基础,包括 机器人导航、增强现实(AR)、相机标定(Calibration)以及物体跟踪…...
第005文-模拟入侵网站实现0元购
1、部署导入靶场,部署购物网站 首先在虚拟机中新增一个centos虚拟机,在上面部署一套完整的购物网站,使用mysql数据库,访问端口是80。这个新增的centos虚拟机就是我们的靶场。购物网站在网上随便找一套开源的部署即可。 2、在网站…...
unity3d 背景是桌面3d数字人,前面是web的表单
是可以实现的,但涉及多个技术栈的结合,包括 Unity3D、Web 技术(HTML、JavaScript)、以及可能的 WebGL 或 WebRTC 技术。大致有以下几种实现方案: 方案 1:Unity 作为独立应用(桌面端࿰…...
23种设计模式简介
一、创建型(5种) 1.工厂方法 总店定义制作流程,分店各自实现特色披萨(北京店-烤鸭披萨,上海店-蟹粉披萨) 2.抽象工厂 套餐工厂(家庭装含大披萨薯条,情侣装含双拼披萨红酒&#…...
淘宝关键字搜索接口爬虫测试实战指南
在电商数据分析和市场研究中,通过关键字搜索获取淘宝商品信息是一项重要任务。淘宝开放平台提供了 item_search 接口,允许开发者通过关键字搜索商品,并获取商品列表及相关信息。本文将详细介绍如何设计并测试一个基于该接口的爬虫程序&#x…...
IntelliJ IDEA 中配置 Groovy
在 IntelliJ IDEA 中配置 Groovy 环境可以分为以下几个步骤 1. 安装 Groovy 插件 步骤: 打开 IntelliJ IDEA,进入菜单栏:File → Settings(Windows/Linux)或 IntelliJ IDEA → Preferences(Mac࿰…...
【Linux 22.4 ubuntu 安装cuda12.1 完整方案】
下载cuda12.1 官网网址 wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda_12.1.1_530.30.02_linux.run sudo sh cuda_12.1.1_530.30.02_linux.run!import! 如果已经安装驱动,则不要选择dirver那项 添加环境变量 vim ~/.b…...
使用AI整理知识点--WPF动画核心知识
一、WPF动画基础 1、动画本质 通过随时间改变依赖属性值实现视觉效果(如位置、透明度、颜色等)。 依赖属性必须支持 DependencyProperty,且需是可动画的(如 Double, Color, Point 等)。 2、动画三要素 起始值 (Fr…...
HTML前端手册
HTML前端手册 记录前端框架在使用过程中遇到的各种问题和解决方案,供后续快速进行手册翻阅使用 文章目录 HTML前端手册1-前端框架1-TypeScript框架2-CSS框架 2-前端Demo1-Html常用代码 2-知云接力3-Live2D平面动画 3-前端运维1-NPM版本管理 1-前端框架 1-TypeScrip…...
风控模型算法面试题集结
特征处理 1. 特征工程的一般步骤什么?什么是特征迭代 特征工程一般包含: 数据获取,分析数据的可用性(覆盖率,准确率,获取容易程度)数据探索,分析数据业务含义,对特征有一个大致了解,同时进行数据质量校验,包含缺失值、异常值和一致性等;特征处理,包含数据处理和…...
利用 requestrepo 工具验证 XML外部实体注入漏洞
1. 前言 在数字化浪潮席卷的当下,网络安全的重要性愈发凸显。应用程序在便捷生活与工作的同时,也可能暗藏安全风险。XXE(XML外部实体)漏洞作为其中的典型代表,攻击者一旦利用它,便能窃取敏感信息、掌控服务…...
引领变革!北京爱悦诗科技有限公司荣获“GAS消费电子科创奖-产品创新奖”!
在2025年“GAS消费电子科创奖”评选中,北京爱悦诗科技有限公司提交的“aigo爱国者GS06”,在技术创新性、设计创新性、工艺创新性、智能化创新性及原创性五大维度均获得评委的高度认可,荣获“产品创新奖”。 这一奖项不仅是对爱悦诗在消费电子…...
MySQL JOIN 与子查询深度对比:原理、性能陷阱与优化策略
1. 基础概念:JOIN 与子查询的本质区别 1.1 JOIN 的核心作用 目标:直接关联两个表的行,通过匹配条件(如 ON 或 USING)合并数据。典型场景:需要同时获取两个表的字段(如 SELECT A.col, B.col FROM A JOIN B)。执行逻辑: 数据库一次性处理两表关系,优化器可能选择 Nest…...
稀疏注意力:打破Transformer计算瓶颈,实现高效长序列建模
引言:Transformer的辉煌与困境 近年来,Transformer凭借其强大的自注意力机制(Self-Attention),在自然语言处理、图像识别等领域大放异彩。然而,传统自注意力机制要求模型计算输入序列中所有位置对之间的关联…...
PTA 7-8 哈利·波特的考试
题目描述 哈利波特要考试了,他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是 haha,将老鼠变成鱼的魔咒是 hehe 等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如 ahah 可以将老鼠变…...
纯html文件实现目录和文档关联
目录结构 效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>项目结题报告</title><style lang"scss">::-webkit-scrollbar {width: 6px;height: 6px;}::-webkit-scro…...
共绘智慧升级,看永洪科技助力由由集团起航智慧征途
在数字化洪流汹涌澎湃的当下,企业如何乘风破浪,把握转型升级的黄金机遇,已成为所有企业必须直面的时代命题。由由集团,作为房地产的领航者,始终以前瞻视野引领变革,坚决拥抱数字化浪潮,携手数字…...
如何搭建个人静态住宅IP:从零开始
你好!今天我们将一起探索如何从头开始搭建个人静态住宅IP。无论您是为了远程办公、在线教育还是游戏加速,静态住宅IP都能带给您更稳定的网络体验。 一、准备阶段 1. 明确需求 首先,您需要清楚自己为什么需要静态住宅IP。可能是为了实现远程…...
《打造视频同步字幕播放网页:从0到1的技术指南》
《打造视频同步字幕播放网页:从0到1的技术指南》 为什么要制作视频同步字幕播放网页 在数字化信息飞速传播的当下,视频已然成为内容输出与获取的核心载体,其在教育、娱乐、宣传推广等诸多领域发挥着举足轻重的作用 。制作一个视频同步字幕播…...
自学嵌入式第27天------TCP和UDP,URL爬虫
1. TCP和UDP区别 **TCP(传输控制协议)和UDP(用户数据报协议)**是两种主要的传输层协议,它们在数据传输方式上有显著区别: 连接性: TCP是面向连接的协议,通信前需通过三次握手建立连…...
C++ 学生成绩管理系统
一、项目背景与核心需求 成绩管理系统是高校教学管理的重要工具,本系统采用C++面向对象编程实现,主要功能模块包括: 学生信息管理(学号/姓名/3门课程成绩) 成绩增删改查(CRUD)操作 数据持久化存储 统计分析与报表生成 用户友好交互界面 二、系统架构设计 1. 类结构设计 …...
Spring Cloud Alibaba 实战:轻松实现 Nacos 服务发现与动态配置管理
1. Nacos 介绍 1.1 什么是 Nacos? Nacos(Naming and Configuration Service)是阿里巴巴开源的一个服务注册中心和配置管理中心。它支持动态服务发现、配置管理和服务治理,适用于微服务架构,尤其是基于 Spring Cloud …...
关于sqlalchemy的使用
关于sqlalchemy的使用 说明一、sqlachemy总体使用思路二、安装与创建库、连结库三、创建表、增加数据四、查询记录五、更新或删除六、关联表定义 说明 本教程所需软件及库python3.10、sqlalchemy安装与创建库、连结库创建表、增加数据查询记录 一、sqlachemy总体使用思路 在…...
三维建模与视频融合(3D-Video Integration)技术初探。
三维建模与视频融合(3D-Video Integration)是一种将虚拟三维模型无缝嵌入实拍视频场景的技术,广泛应用于影视特效、增强现实(AR)、游戏开发、广告制作 、视频监控 等领域。 一、技术核心流程 三维建模与动画 使用工具…...
springboot3 RestClient、HTTP 客户端区别
1 RestClient使用 RestClient 是 Spring 6.1 M2 中引入的同步 HTTP 客户端,它取代了 RestTemplate。同步 HTTP 客户端以阻塞方式发送和接收 HTTP 请求和响应,这意味着它会等待每个请求完成后才继续下一个请求。本文将带你了解 RestClient 的功能以及它与…...
分布式存储学习——HBase概述
1.1 HBase概述 1.1.1 理解大数据背景 1.1.2 HBase是什么 1.1.3 HBase与Hadoop的关系 1.1.4 HBase的核心功能模块 1.1.5 HBase的应用场景和经典案例 1.1.6 小结 本文参考于学校《HBase应用于开发》教材 1.1 HBase概述 本节将介绍大数据背景和HBase的基本概念,…...
