在这里插入图片描述

😊你好,我是小航,一个正在变秃、变强的文艺倾年。
🔔本专栏《八股消消乐》旨在记录个人所背的八股文,包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点,期待与你一同探索、学习、进步,一起卷起来叭!

目录

  • 题目
  • 答案
    • Why use 消息队列?
    • 秒杀场景
    • 订单超时取消
    • 事件驱动(Event-Driven)

题目

💬技术栈:RocketMQ、Kafka、RabbitMQ

🔍简历内容:熟悉消息队列常见应用场景,基于事件驱动实现了 SAGA 的分布式事务,保证了事务的低耦合、高扩展、高可用。

🚩面试问:你为什么用 Kafka、RabbitMQ 或 RocketMQ,又或者说你为什么使用某一个中间件?


在这里插入图片描述

💡建议暂停思考10s,你有答案了嘛?如果你有不同题解,欢迎评论区留言、打卡。


答案

前置准备:

  • 你们公司有没有使用消息队列?主要用于解决什么场景的问题?
  • 如果使用了消息队列,那么在具体的场景下不使用消息队列是否可行?和使用消息队列的方案比起来,有什么优缺点?
  • 你们公司用的是什么消息队列,它有什么优缺点?

Why use 消息队列?

为什么要用消息队列?【其实就是再问在这个业务场景下,不异步、不解耦或者不削峰会有什么问题?】

答案:如果不用消息队列,性能差、扩展性差、可用性差。【同步调用的缺点】

性能差:业务方必须停下来等待结果,如果我这里需要通知三个下游,那么就需要发起三次调用,并且等它们各自的结果返回之后才能继续往下执行,或者返回响应,这样性能太差了。

在这里插入图片描述

扩展性差:在使用消息队列的时候,新的下游要接入,只需要自己去订阅消息就可以,完全不需要通知任何人。在公司里,可能就是你丢给下游一个文档,下游自己看看文档,知道订阅哪个 topic,消息生产速率有多高,差不多就能自己独立完成接入了

而同步调用的时候,上游必须知道下游的接口,然后要知道如何构造请求、如何解析响应,还要联调、测试、上线,整个过程都得和下游密切合作,因此效率特别低,可扩展性很差。

在这里插入图片描述

如果在某些场景下确实不能用消息队列,那么这个扩展性问题可以通过一些技术手段来缓解。比如说上游提供一整套的对接规范,包括 API 定义、请求和响应中每个字段的含义。这样下游就对着这个 API 定义来提供实现,上游就不需要适配每一个下游了。

在这里插入图片描述

可用性:在同步调用方案中,你必须要确保调用所有的下游都成功了才算是成功了。所以你还需要额外考虑部分成功部分失败的问题。

秒杀场景

架构设计:

在这里插入图片描述
利用消息队列把整个秒杀过程分成轻重两个部分

  • 进入消息队列之前:秒杀请求进来之后,会有一个轻量级的服务。这个服务就是做一些限流、请求校验和库存扣减的事情。这些事情差不多都是内存操作,最多操作 Redis。当库存扣减成功之后,就会把秒杀请求丢到一个消息队列
  • 进入消息队列之后:订单服务会从消息队列里面将请求拿出来真正创建订单,并且提示用户支付。这一部分就是重量级的操作,无法支撑大规模并发。

在这里插入图片描述

订单超时取消

场景:扣减了库存之后,用户没有支付怎么办。

解决方案:如果用户下单之后一直没有支付,那么这个订单就会被取消,从而释放库存。想利用消息队列实现订单超时取消功能,需要使用 延时消息。(超时时间是 30 分钟)

延时消息:发送者在发送之后,要过一段时间,消费者才能消费的消息

在这里插入图片描述

可能引发的并发问题:在 30 分钟这一个时刻,一边用户支付,一边消费者也消费超时消息,就会有并发问题

在这里插入图片描述

解决思路:使用分布式锁、乐观锁(在你把订单更新为超时状态的时候,需要 确保原始状态还是未支付。支付那边也需要确保只有在 status 是未支付的时候才能发起支付。),也可以使用 SELECT FOR UPDATE 锁住订单,防止并发操作。

目前主流的消息队列中 RocketMQ 是支持延时消息的,它有插件支持。但是 Kafka 不支持。

事件驱动(Event-Driven)

事件驱动适合用来解决一些 复杂、步骤繁多、流程冗长 的业务问题。

在这里插入图片描述
场景:事件驱动结合 SAGA 分布式事务。

在这里插入图片描述

当某一个步骤完成之后,就会发出一个或者多个事件,驱动事务中的后续步骤。包括回滚也是这样,比如说发出一个代表某一个步骤执行失败的事件,对应的消费者就会去执行反向补偿步骤

不过在实时性上要比同步调用差一点。比如说你有一个分布式事务,就是要求先更新 DB,再更新缓存。那么在缓存更新失败的场景下,过程看起来就像图里展示的这样。

在这里插入图片描述


往期精彩专栏内容,欢迎订阅:

🔗【八股消消乐】20250622:Elasticsearch查询优化
🔗【八股消消乐】20250620:Elasticsearch优化—检索Labubu
🔗【八股消消乐】20250619:构建微服务架构体系—保证服务高可用
🔗【八股消消乐】20250615:构建微服务架构体系—链路超时控制
🔗【八股消消乐】20250614:构建微服务架构体系—实现制作库与线上库分离
🔗【八股消消乐】20250612:构建微服务架构体系—限流算法优化
🔗【八股消消乐】20250611:构建微服务架构体系—降级策略全总结
🔗【八股消消乐】20250610:构建微服务架构体系—熔断恢复抖动优化
🔗【八股消消乐】20250609:构建微服务架构体系—负载均衡算法如何优化
🔗【八股消消乐】20250608:构建微服务架构体系—服务注册与发现
🔗【八股消消乐】20250607:MySQL存储引擎InnoDB知识点汇总
🔗【八股消消乐】20250606:MySQL参数优化大汇总
🔗【八股消消乐】20250605:端午节产生的消费数据,如何分表分库?
🔗【八股消消乐】20250604:如何解决SQL线上死锁事故
🔗【八股消消乐】20250603:索引失效与优化方法总结
🔗【八股消消乐】20250512:慢SQL优化手段总结
🔗【八股消消乐】20250511:项目中如何排查内存持续上升问题
🔗【八股消消乐】20250510:项目中如何优化JVM内存分配?
🔗【八股消消乐】20250509:你在项目中如何优化垃圾回收机制?
🔗【八股消消乐】20250508:Java编译优化技术在项目中的应用
🔗【八股消消乐】20250507:你了解JVM内存模型吗?
🔗【八股消消乐】20250506:你是如何设置线程池大小?
🔗【八股消消乐】20250430:十分钟带背Duubo中大厂经典面试题
🔗【八股消消乐】20250429:你是如何在项目场景中选取最优并发容器?
🔗【八股消消乐】20250428:你是项目中如何优化多线程上下文切换?
🔗【八股消消乐】20250427:发送请求有遇到服务不可用吗?如何解决?

📌 [ 笔者 ]   文艺倾年
📃 [ 更新 ]   2025.6.23
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!

在这里插入图片描述

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

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

相关文章

WebSocket长连接在小程序中的实践:消息推送与断线重连机制设计

一、引言:为什么需要WebSocket长连接? 传统方案的痛点:HTTP轮询的低效性(高延迟、高资源消耗)小程序场景需求:实时消息推送(如IM、直播弹幕、IoT设备状态同步)技术选型对比&#xf…

MySQL索引使用指南:何时该为字段添加索引?

在MySQL的性能优化中,索引是最常用且有效的手段之一。但“索引不是万能药”——盲目添加索引可能导致写操作变慢、存储空间浪费,甚至引发索引失效问题。本文将结合原理与实战场景,帮你理清​​“何时该用索引”​​的核心判断逻辑。 一、先理…

AI时代关键词SEO优化

内容概要 在人工智能(AI)驱动的时代浪潮下,搜索引擎优化(SEO)正迎来深刻变革,关键词策略已成为流量获取的核心战场。本文将系统剖析AI时代关键词优化的前沿方法,涵盖语义分析的精准研究、用户意…

GO 语言学习 之 代码风格

1. 命名规范 字母数字和下划线组成 以小写字母、大写字母或下划线开头 不允许包含标点符号、运算符、空白字符(空格、TAB、换行)等 采用驼峰命名法 (大驼峰、小驼峰) 见名知义:命名要有实际意义,易读性&am…

【软考高级系统架构论文】论云上自动化运维及其应用

论文真题 云上自动化运维是传统IT运维和 DevOps的延伸,通过云原生架构实现运维的再进化。云上自动化运维可以有效帮助企业降低IT运维成本,提升系统的灵活度,以及系统的交付速度,增强系统的可靠性,构建更加安全、可信、开放的业务平台。 请围绕“云上自动化运维及其应用”…

错误: 程序包androidx.fragment.app不存在 import android

错误: 程序包androidx.fragment.app不存在 import androidx.fragment.app.FragmentActivity; 这个是什么错?dependencies { //implementation fileTree(dir: libs, include: [*.jar]) implementation project(path: :libscan) //noinspection GradleCompatible implementation…

Java UDP Socket 实时在线刷卡扫码POS消费机门禁控制板服务端示例源码

本示例使用的设备&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bYG0BuO&ftt&id17021194999 一、获取本电脑所有网卡IP public static String getIP() {Enumeration<NetworkInterface> netInterfaces;ArrayList<String>…

MATLAB基础应用精讲-【数模应用】层次分析法(AHP)(附MATLAB和python代码实现)

目录 前言 算法原理 什么是层次分析法(AHP) 注意事项 基本原理 算法步骤 1建立层次结构 2构建判断矩阵 3计算权重向量 4一致性检验 SPSSAU AHP层次分析案例 1、背景 2、理论 3、操作 4、SPSSAU输出结果 5、文字分析 6、剖析 疑难解惑 数据如何录入? 如何…

Macintosh小电脑、小手机 | openKylin最新硬件创意形态首次亮相!

近期&#xff0c;OpenAtom openKylin&#xff08;简称 “openKylin”&#xff09;社区与嘉立创旗下的立创开发板团队展开深度技术合作&#xff0c;成功完成立创・泰山派1开发板与openKylin 2.0操作系统的兼容适配。5月24日&#xff0c;嘉立创“第三届开源硬件星火会”在深圳盛大…

基于Spring Boot的计算机考研交流系统的设计与实现

基于Spring Boot的计算机考研交流系统的设计与实现 随着计算机科学的发展&#xff0c;越来越多的学生选择考研来提高自己的专业水平。然而&#xff0c;考研的过程中&#xff0c;学生们面临着各种问题&#xff0c;如学习资料的获取、交流平台的缺乏等。为了更好地满足这些需求&…

技术逐梦之旅:从C语言到Vue的成长之路

董翔&#xff0c;一个对软件技术充满热忱的00后。从初次在屏幕上敲出"Hello World"的激动&#xff0c;到如今能够独立开发完整Web应用的从容&#xff0c;我的编程之路见证了技术的迭代与自我的蜕变。 作为软件专业的学生&#xff0c;我始终坚信"技术是解决问题…

Qt QMap数据清除测试(验证QMap内存正确释放方法)

环境 Qt C (msvc编译环境) 测试代码 //定义 动子信息 &#xff08;可放在.cpp文件 中&#xff09; struct MoverInfo{uint32_t ID;double PartPosition;uint16_t ModuleID;uint32_t PartID;uint32_t TrackID;uint32_t TrackID2; };//使用Windows任务管理器查看内存使用情况//…

【安全咨询】

安全咨询服务是一个专业领域&#xff0c;旨在帮助个人和组织识别、评估和管理各种安全风险&#xff0c;保护其人员、资产、信息和运营安全。 一、安全咨询 1.1 服务的核心目标 ​识别风险&#xff1a;​​ 发现潜在的、可能对组织或个人造成损害的威胁和漏洞。​评估威胁&am…

vue+elementUI实现固定table超过设定高度显示下拉条

解决方案&#xff1a; 在表格上添加了style"height: px;"和:max-height""&#xff0c;这两个设置共同作用使表格在内容超过 设定高度时显示滚动条配合css使用 高度值可根据实际需求调整 <el-table:data"biddData"style"width: 100%;…

UNet改进(5):线性注意力机制(Linear Attention)-原理详解与代码实现

引言 在计算机视觉领域&#xff0c;UNet架构因其在图像分割任务中的卓越表现而广受欢迎。近年来&#xff0c;注意力机制的引入进一步提升了UNet的性能。本文将深入分析一个结合了线性注意力机制的UNet实现&#xff0c;探讨其设计原理、代码实现以及在医学图像分割等任务中的应…

Unity技能编辑器深度构建指南:打造专业级战斗系统

本文为技术团队提供完整的技能编辑器开发指南&#xff0c;涵盖核心架构设计、资源管线搭建和协作工作流实现&#xff0c;帮助您构建专业级的战斗技能系统。 一、核心架构设计 1. 基础框架搭建 专用场景模板&#xff1a; 创建SkillEditorTemplate.unity场景 核心节点&#xff…

《游戏工业级CI/CD实战:Jenkins+Node.js自动化构建与本地网盘部署方案》

核心架构图 一、游戏开发CI/CD全流程设计 工作流时序图 二、Jenkins分布式构建配置 1. 节点管理&#xff08;支持Win/Linux/macOS&#xff09; // Jenkinsfile 分布式配置示例 pipeline {agent {label game-builder // 匹配带标签的构建节点}triggers {pollSCM(H/5 * * * *)…

Python内存使用分析工具深度解析与实践指南(上篇)

文章目录 引言1. sys.getsizeof()功能程序示例适用场景 2. pandas.Series.memory_usage()功能程序示例适用场景 3. pandas.Series.memory_usage(deepTrue)功能程序示例适用场景注意事项 4. pympler.asizeof()功能安装程序示例适用场景 5. tracemalloc&#xff08;标准库&#x…

Python 使用 Requests 模块进行爬虫

目录 一、请求数据二、获取并解析数据四、保存数据1. 保存为 CSV 文件2. 保存为 Excel 文件打开网页图片并将其插入到 Excel 文件中 五、加密参数逆向分析1. 定位加密位置2. 断点调试分析3. 复制相关 js 加密代码&#xff0c;在本地进行调试&#xff08;难&#xff09;4. 获取 …

MySQL行转列、列转行

要达到的效果&#xff1a; MySQL不支持动态行转列 原始数据&#xff1a; 以行的方式存储 CREATE TABLE product_sales (id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(50) NOT NULL,category VARCHAR(50) NOT NULL,sales_volume INT NOT NULL,sales_date DATE N…