Java后端面试题(mq相关)(day9)

server/2024/9/20 7:15:19/ 标签: rabbitmq, 面试, 笔记

目录

为什么用MQ? 异步 、削峰、解耦


MQ(Message Queue,消息队列)是一种在分布式系统中进行消息传递的技术,它主要用于实现服务间的 解耦异步处理削峰填谷等功能。下面我将分别解释这几个概念,并说明它们是如何通过MQ实现的。

1. 异步处理

异步处理是指一个操作不需要等待另一个操作完成就可以继续执行的过程

  • 在传统的同步模式下,客户端发送请求后必须等待服务器响应才能继续执行后续操作
  • 而在异步模式下,客户端发送请求后无需等待,可以立即返回并执行其他任务,服务器处理完请求后再通知客户端结果

MQ如何实现异步处理

  • 当客户端向服务端发送请求时,该请求不是直接被服务端处理,而是先存入MQ中
  • 服务端从MQ中获取请求消息后进行处理,客户端无需等待服务端处理完成即可继续执行其他任务。
  • 这种方式提高了系统的响应速度和吞吐量,使得系统能够处理更多的并发请求。

2. 解耦

解耦是指降低系统各组件之间的依赖性,使得每个组件都可以独立地开发、部署和扩展。这有助于提高系统的灵活性和可维护性。

MQ如何实现解耦:

  • 发送方将消息发送到MQ中,而接收方从MQ中读取消息。这样发送方和接收方之间就不存在直接的调用关系。
  • 即使接收方暂时不可用,发送方也可以继续发送消息,因为消息会被暂存在MQ中,直到接收方恢复可用。
  • 发送方和接收方可以独立扩展,而不影响彼此的工作。

3. 削峰填谷

削峰填谷是指通过缓存、异步处理等手段来平衡系统的负载,避免高峰期系统过载或低谷期资源浪费的情况。

MQ如何实现削峰填谷

  • 在高流量期间,系统产生的大量消息会被存入MQ中,而不是直接由后端服务处理。这可以防止后端服务因短时间内处理大量请求而过载。
  • 当流量高峰过去后,后端服务可以从MQ中慢慢消费这些消息,从而平衡处理过程,确保服务质量。
  • 通过这种方式,系统能够在高峰期吸收额外的请求,在低谷期释放资源,从而达到资源的有效利用。

综上所述,MQ作为一种重要的中间件技术,对于提升系统的性能、稳定性和可扩展性具有重要作用。

Exchange类型


常用的交换机有以下三种,因为消费者是从队列获取信息的,队列是绑定交换机的,所以对应的消息推送/接收模式也会有以下几种:

  1. Direct Exchange
    直连型交换机根据RoutingKey(路由键)路由到不同的队列
  2. Fanout Exchange
    扇型(广播)交换机,这个交换机没有路由键概念,就算你绑了路由键也是无视的。 这个交换机在接收到消息后,会直接转发到绑定到它上面的所有队列。
  3. Topic Exchange
    主题交换机,这个交换机其实跟直连交换机流程差不多,但是它的特点就是在它的路由键和绑定键之间是有规则的。
    简单地介绍下规则:
  • * (星号) 用来表示一个或多个字符
  • # (井号) 用来表示任意数量的字符

什么是死信队列?


  • 死信(Dead Letter):是指在消息队列系统中那些无法被正常消费的消息

  • 死信队列(Dead Letter Queue, DLQ):当消息无法被正常处理时,也就是死信,可以将这些死信发送到一个专门的队列中,以便于后续检查和处理

以下是一些可能导致消息成为死信的情况:

  1. 消息被拒绝访问:消费者显式地拒绝了消息(使用 channel.BasicNack 或 channel.BasicReject 方法),并且设置了 requeue 参数为 false,这意味着消息不应该被重新放回原队列。
  2. 消费者发生异常,超过重试次数 。 (其实spring框架调用的就是 basicNack)
  3. 消息过期:如果消息设置了生存时间(Time To Live, TTL),并且超过了这个时间限制,消息就会变为死信
  4. 队列达到最大长度:如果消息队列达到了最大长度限制,新的消息将无法加入队列,这时这些新消息也会变成死信。

如何保证消息的可靠性?


消息丢失场景

  • 消息到 MQ 的过程中搞丢
  • MQ 自己搞丢
  • MQ 到消费过程中搞丢。

生产端消息可靠性保证

  • 消息持久化
    当生产者发布消息时,可以选择将其标记为持久化到磁盘上。

  • 确认(Confirm)机制
    开启confirm回调模式后,RabbitMQ会在消息成功写入到磁盘并至少被一个交换器接受后,向生产者发送一个确认(acknowledgement)。

    若消息丢失或无法投递给任何队列,RabbitMQ将会发送一个否定确认(nack). 生产者可以根据这些确认信号判断消息是否成功送达并采取相应的重试策略。

消费端消息可靠性保证

  • 消息确认(Acknowledgements)

    1. 手动应答:代码冗余多,容易出现死循环。
    2. 自动应答:开启重试功能,发生错误时重新发送,可配置死信队列,重试一定次数后放入死信队列。
  • 死信队列(Dead Letter Queue)

RabbitMQ中如何解决消息堆积问题?


解决消息堆积有三种种思路:

  • 扩大队列容积,提高堆积上限,采用惰性队列
    1. 在声明队列的时候可以设置属性x-queue-mode为lazy,即为惰性队列
    2. 基于磁盘存储,消息上限高
    3. 性能比较稳定,但基于磁盘存储,受限于磁盘I0,时效性会降低
  • 增加更多消费者,提高消费速度(不能保证有序性)
  • 在消费者内开启线程池加快消息处理速度(不能保证有序性)

RabbitMQ中如何保证消息有序性?


单个队列与单一消费者:

  • 单个队列:将所有需要保持有序的消息发送到同一个队列中。RabbitMQ的队列是先进先出(FIFO)的数据结构,消息在被发送到队列之后,会按照发送的顺序被排列在队列中。
  • 单一消费者:确保该队列只被一个消费者(单线程)处理。这样,消费者会按照队列中的顺序接收到消息,并依次处理,从而保证了消息的顺序性。

如何防止消息重复消费?(如何保证消息幂等性)


幂等性指的是一个操作无论执行多少次,其结果都是相同的。

在分布式系统和消息队列中,幂等性特别重要,因为它可以确保即使在消息重复发送或处理过程中出现故障的情况下,系统状态的一致性和数据的完整性。

生产端保证消息的幂等性

  • 状态检查
    在消息发送前,先查询数据库,确认此消息是否已被处理过(一般通过单据状态)。如果是,则直接忽略;否则,继续处理,并在处理完成后更新消息状态为已处理。

消费端保证消息的幂等性

  • 唯一标识:每个消息都携带一个业务ID(BizId),如订单号、交易流水号等,以便在消费端能够识别重复的消息。

http://www.ppmy.cn/server/102044.html

相关文章

ARM——体系结构

计算机体系结构:冯诺伊曼 哈佛 冯诺依曼结构 冯诺依曼结构,也称冯诺依曼模型或普林斯顿结构,是根据冯诺依曼提出的存储程序概念设计的计算机体系结构。其主要特点包括: 存储程序:指令与数据都…

嵌入式 | 嵌入式 Linux 系统使用摄像头

点击上方"蓝字"关注我们 01、引言 >>> 在嵌入式 Linux 系统使用摄像头 俗话说“眼见为实”,这或许是为什么近年来摄像头在嵌入式系统上快速增长的原因。它们被用于不同的场景,如: 远程监控:典型的例子是闭路电视,监控人员在监视环境(或许你所在的大楼…

web开发环境搭配与创建javaee项目

一.web开发 (1)web开发指的是前端,后端,以及数据库进行交互,前端发送请求到后端,后端经过程序处理后到达数据库,最后在进行后端处理响应回前端。 (2)一次三端交互的doget或者dopost简单请求流程 (3)web开发除了需要前端,后端,数据库开发工具…

C#垃圾处理机制相关笔记

C#编程中的垃圾处理机制主要通过垃圾回收器(Garbage Collector,GC)实现自动内存管理。C#作为一种托管语言,其垃圾处理机制显著减轻了程序员的内存管理负担,与C语言等非托管语言形成鲜明对比。具体介绍如下:…

ElasticSearch相关知识点

ElasticSearch中的倒排索引是如何工作的? 倒排索引是ElasticSearch中用于全文检索的一种数据结构,与正排索引不同的是,正排索引将文档按照词汇顺序组织。而倒排索引是将词汇映射到包含该词汇的文档中。 在ElasticSearch中,倒排索…

ArrayList 和 LinkedList 的区别是什么

数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指…

greenplum授权

1. 表空间(Tablespace) CREATE:创建表空间权限USAGE:使用表空间权限 在Greenplum数据库中,表空间(Tablespace)是用于存储数据库对象的物理位置。以下是表空间相关的授权和相应的语法&#xff…

精武杯的部分复现

标红的为答案 计算机手机部分 1、请综合分析计算机和⼿机检材,计算机最近⼀次登录的账户名是?admin 2.请综合分析计算机和⼿机检材,计算机最近⼀次插⼊的USB存储设备串号是?S3JKNX0JA05097Y 3.请综合分析计算机和⼿机检材,谢弘…

《数据中心网络架构与技术》第七章构建数据中心的逻辑网络

Overlay网络 ,Overlay网络即通过在现有Underlay网络上叠加一个软件定义的逻辑网络,解决数据中心网络中诸如大规模虚拟机之间二层互通的问题。 Overlay网络和Underlay网络完全解耦,将网络虚拟化并构建出面向应用的自适应逻辑网络&#xff0c…

Isaac Sim 11 粒子

注意:omni.particle.system.core 目前正在进行大量更改。使用现有扩展构建的系统需要在 USD Composer 2023.2 版本中。 1.打开粒子扩展 2. 设置透明度 如果材质中使用的图像具有一定范围的透明度,需要启用Fractional Cutout Opacity(位置在第…

看demo学算法之 线性回归模型

嗨!今天我们来聊聊如何用Python构建一个简单的线性回归模型。这个过程就像给数据配对舞一样,让它们在舞池里找到最佳位置。准备好了吗?让我们开始吧!🚀 第一步:数据准备 首先,我们要准备一些数…

山西大同大学学生公寓管理系统boot--论文pf

TOC springboot455山西大同大学学生公寓管理系统boot--论文pf 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科…

我问GPT flutter

flutter可以开发android 和ios吗 ChatGPT 说: ChatGPT 是的,Flutter 可以同时开发 Android 和 iOS 应用程序。Flutter 是一个由 Google 开发的开源 UI 工具包,用于构建高性能、跨平台的应用程序。使用 Flutter,你可以用一套代码…

linux更换为阿里云的yum下载镜像源

更换镜像源 1.备份: sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.创建一个文件: cd /etc/yum.repos.d/ touch CentOS-Base.repo 3.往CentOS-Base.repo添加内容 vi CentOS-Base.repo 添加以下内容: [base…

高级java每日一道面试题-2024年8月15日-设计模式篇-设计模式与面向对象原则的关系是什么?

如果有遗漏,评论区告诉我进行补充 面试官: 设计模式与面向对象原则的关系是什么? 我回答: 在设计模式与面向对象原则的关系中,两者紧密相连且相互促进。面向对象的原则为设计模式的形成提供了理论基础和指导思想,而设计模式则是这些原则在…

webrtc学习笔记3

Nodejs实战 对于我们WebRTC项目而言,nodejs主要是实现信令服务器的功能,客户端和服务器端的交互我们选择websocket作为通信协议,所以以websocket的使用为主。 web客户端 websocket WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行…

后端开发刷题 | 二分查找

描述 请实现无重复数字的升序数组的二分查找 给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1 数据范…

11、常见API

01、String类概述及构造方法简介 一、字符串 由多个字符组成的一串数据 二、简介 String类代表的是一个字符串。字符串对象在开发中是最常见的。为了方便我们对字符串进行操作,java就把字符串用对象进行了封装,这个封装就是String类 三、String类的构造方…

Oracle(62)什么是内存优化表(In-Memory Table)?

内存优化表(In-Memory Table)是指将表的数据存储在内存中,以提高数据访问和查询性能的一种技术。内存优化表通过利用内存的高速访问特性,显著减少I/O操作的延迟,提升数据处理的速度。这种技术在需要高性能数据处理的应…

网络通信(TCP/UDP协议 三次握手四次挥手 )

三、TCP协议与UDP协议 1、TCP/IP、TCP、 UDP是什么 TCP/IP协议是一个协议簇,里面包括很多协议的, UDP只是其中的一个, 之所以命名为TCP/IP协议, 因为TCP、 IP协议是两个很重要的协议,就用他两命名了,而TCP…