【后端面经】【消息队列】22 | 消息队列:消息队列可以用来解决什么问题?-01

简介: 【5月更文挑战第6天】消息队列的核心特性是异步、削峰和解耦,常用于日志处理和消息通讯,实现事件驱动架构。面试中可能涉及问题包括公司是否使用消息队列、应用场景、优缺点以及延时队列、秒杀架构等。秒杀场景下,消息队列将校验和库存扣减(轻量级)与订单创建(重量级)分隔,减轻系统压力,依赖于Redis性能。使用消息队列能解决高并发、复杂流程同步等问题。

前置知识

消息队列最鲜明的特性是异步、削峰和解耦。这也是消息队列的适用场景和用途。

也有人说,日志处理和消息通讯可以看作是消息队列的具体落地案例,比如日志处理同时利用了消息队列的三个特性。

消息通讯指的是即时通讯之类的工具,比如使用的微信、QQ。通讯工具主要利用的是异步和解耦特性,如果觉得通讯工具有高并发的收发消息场景,也可以看作是削峰。

基本上一切消息队列的应用场景,都是围绕这三个特性来设计。反之,如果有一些需要用到异步、解耦和削峰的需求,消息队列也是最适合的工具。

此外,消息队列还可以用来实现事件驱动架构。

面试准备

  • 公司有没有使用消息队列?主要解决什么场景的问题?

  • 如果使用了消息队列,在具体的场景下不使用消息队列是否可行?和使用消息队列的方案比起来,有什么优缺点。

  • 用的什么消息队列?有什么优缺点。

可以多找几个案例,来体现异步、解耦和削峰三个特性。

常见的面试问题:

  • 有没有使用过消息队列?用来解决什么问题

  • 是否听过延时队列?怎么实现延时队列?

  • 如果涉及一个秒杀架构?回答的时候强调消息队列的作用

  • 什么是事件驱动架构。

基本思路

首先,在简历上写的是擅长消息队列或是用消息队列解决问题

介绍案例后,可能的问题是:在具体的场景下,为什么必须使用消息队列。

下面列举几个引导性很强的场景回答:

秒杀场景

一个比较简单的秒杀架构图如图所示:

2024-05-07-21-21-56-image.png

在消息队列前,要对用户请求做一些校验,比如这个用户是否参与过秒杀。其次要扣库存,扣库存成功才算抢到了。接着把这个请求丢到消息队列里,后续异步创建订单,并且完成支付。

这种设计的精髓在于利用消息队列把整个秒杀过程分为轻重两个部分:

  • 在进入消息队列之前的操作都是轻量级的,一般是内存计算或是访问Redis,所以瓶颈基本取决于Redis的性能

  • 在进入消息队列后就是非常重量级的操作了,比如进一步验证交易的合法性、操作数据库等。

关键词:轻重之分

消息队列还经常被应用在秒杀场景里,最基本的架构就是秒杀请求进来以后,会有一个轻量级的服务。这个服务做一些限流、请求校验和库存扣减的事情,这些事情差不多都是内存操作,最多操作Redis。当库存扣减成功后,把秒杀丢到一个消息队列。

然后订单服务会从消息队列里把请求拿出来,真正创建订单,并且提示用户支付。这部分是重量级的操作,无法支持大规模并发。

所以在这个场景里,可以把消息队列看作是轻重操作的分界线。

目录
相关文章
|
6月前
|
消息中间件 Dubbo Java
Spring全家桶 、Dubbo、分布式、消息队列后端必备全套开源项目
基于 Spring Boot 2.X 版本的深度入门教程。 市面上的 Spring Boot 基础入门文章很多,但是深度入门文章却很少。对于很多开发者来说,入门即是其对某个技术栈的最终理解,一方面是开发者“比较懒”,另一方面是文章作者把 Spring Boot 入门写的太浅,又或者不够全面。
|
5月前
|
NoSQL 消息中间件 数据库
|
5月前
|
消息中间件 Java Spring
JavaWeb后端开发Spring框架之消息 消息队列案例--订单短信通知
JavaWeb后端开发Spring框架之消息 消息队列案例--订单短信通知
49 0
|
6月前
|
消息中间件 缓存 API
【后端面经】【消息队列】22 | 消息队列:消息队列可以用来解决什么问题?-03 扩展性+可用性+事件驱动思想
【5月更文挑战第8天】 本文探讨了扩展性、可用性和事件驱动的概念。扩展性方面,消息队列简化了新下游的接入,而同步调用需要复杂的协调。在保证高可扩展性和研发效率的设计中,若无法使用消息队列,可以提供一致性抽象来减轻接入负担。可用性上,消息队列只需确保消息发送,而同步调用需保证所有下游成功,更易出错。事件驱动是一种通过事件进行组件间通信的架构模式,具有低耦合、高扩展性和高可用性,适合处理复杂流程。结合SAGA的事件驱动方案能实现高级分布式事务管理,即使实时性稍弱,但能保证事务的异步和高效执行。
51 1
|
6月前
|
消息中间件 Kafka 数据库
【后端面经】【消息队列】22 | 消息队列:消息队列可以用来解决什么问题?-02 超时场景+性能问题
【5月更文挑战第7天】 本文介绍了电商中订单超时取消的处理方法,通过使用消息队列实现延时消息。当订单30分钟后未支付,消息队列将触发取消操作,但需注意并发问题,如采用分布式锁或乐观锁避免并发更新订单状态。乐观锁确保只有订单状态为未支付时才允许支付。主流消息队列如RocketMQ支持延迟消息,而Kafka不支持。 使用消息队列的好处在于解耦和提高系统性能、扩展性和可用性。同步调用会导致性能下降,因为必须等待所有调用完成。并发调用虽可提升性能,但仍逊于消息队列,且无法解决扩展性和可用性问题。
116 1
|
消息中间件 存储 安全
2021-Java后端工程师面试指南-(消息队列)(下)
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
156 0
|
消息中间件 NoSQL 算法
2021-Java后端工程师面试指南-(消息队列)(上)
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
171 0
|
4月前
|
消息中间件 C语言 RocketMQ
消息队列 MQ操作报错合集之出现"Connection reset by peer"的错误,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
4月前
|
消息中间件 Java C语言
消息队列 MQ使用问题之在使用C++客户端和GBase的ESQL进行编译时出现core dump,该怎么办
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。