首页 > 编程语言 >Java后端面试题(mq相关)(day9)

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

时间:2024-08-17 13:52:52浏览次数:16  
标签:面试题 Java day9 队列 发送 处理 死信 MQ 消息

目录

为什么用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),如订单号、交易流水号等,以便在消费端能够识别重复的消息。

标签:面试题,Java,day9,队列,发送,处理,死信,MQ,消息
From: https://blog.csdn.net/qq_57036151/article/details/141151292

相关文章

  • Java中的图算法:如何实现高效的最短路径计算
    Java中的图算法:如何实现高效的最短路径计算大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!作为开头。最短路径算法是图论中的一个核心问题,广泛应用于网络路由、地图导航等领域。在Java中实现高效的最短路径计算通常涉及到Dijkstra算法和Floy......
  • 后端实习面试题
    1.有没有用过分页?Mybatis-PageHelper2.如果你想实现分页这个功能,需要前端传递哪些参数?后端给前端返回哪些数据?前端传递以下参数给后端:pageNum:当前页码,表示要查询的是第几页的数据。pageSize:每页显示的数据条数,确定每页显示的数据量。其他查询条件:可选参数,如筛选条件......
  • 点亮职场之路,从优化简历开始 —— 专业Java简历优化服务,助您脱颖而出
    手机或电脑浏览器就可以打开,面霸宝典【全拼音】.com这里可以优化简历,模拟面试,企业项目源码,最新最全大厂高并发面试题,项目场景题,算法题,底层原理题在Java技术的浩瀚星海中,每一位求职者都是独特的星辰,但如何让自己在众多候选人中熠熠生辉,成为企业争抢的“宝藏”?答案,就藏在......
  • Java简历优化专家 —— 打造您的职业名片,引领梦想职位之旅
    手机或电脑浏览器就可以打开,面霸宝典【全拼音】.com这里可以优化简历,模拟面试,企业项目源码,最新最全大厂高并发面试题,项目场景题,算法题,底层原理题在Java编程的征途上,每一步都至关重要。而一份精心优化的简历,正是您迈向理想职位的第一步。我们深知,每一位Java求职者都渴望......
  • 面试题:在Java中,JVM(Java虚拟机)的内存模型是如何设计的?请详细解释堆(Heap)、栈(Stack)、方法
    面试题:在Java中,JVM(Java虚拟机)的内存模型是如何设计的?请详细解释堆(Heap)、栈(Stack)、方法区(MethodArea)以及程序计数器(ProgramCounterRegister)的作用和它们之间的关系。更多答案在这里,手机或电脑浏览器就可以打开,面霸宝典【全拼音】.com这里可以优化简历,模拟面试,企业项......
  • 面试题:在Java中,线程之间的通信主要通过哪几种方式实现?并简述其中一种方式的基本工作原
    面试题:在Java中,线程之间的通信主要通过哪几种方式实现?并简述其中一种方式的基本工作原理。请注意,除了直接回答此问题外,我们还为您准备了更多深入的学习资源和面试技巧。想要了解更多关于Java线程通信、优化简历、模拟面试、企业项目源码、大厂高并发面试题、项目场景题、算法......
  • 面试题:在Java中,多线程编程是常见的并发处理方式。请简述Java中实现多线程的几种主要方
    面试题:在Java中,多线程编程是常见的并发处理方式。请简述Java中实现多线程的几种主要方式,并解释每种方式的基本思想。更多关于多线程编程的深入解析、面试技巧、以及实战项目源码,手机浏览器即可访问面霸宝典【全拼音】.com,这里不仅可以优化你的简历,还能进行模拟面试,获取最新最......
  • 【Java求职者的福音:专业简历优化服务,助力梦想启航】
    手机或电脑浏览器就可以打开,面霸宝典【全拼音】.com这里可以优化简历,模拟面试,企业项目源码,最新最全大厂高并发面试题,项目场景题,算法题,底层原理题在Java技术的浩瀚星海中,您是那颗璀璨的新星,正蓄势待发,准备在职场上绽放光芒。但在这个充满机遇与挑战的时代,如何让您的简历......
  • 面试题:在Java中,volatile 关键字的作用是什么?它与 synchronized 关键字在实现线程同步
    面试题:在Java中,volatile 关键字的作用是什么?它与 synchronized 关键字在实现线程同步方面有何不同?请深入探讨其背后的原理和应用场景。更多答案在这里,手机或电脑浏览器就可以打开, 面霸宝典【全 拼音】.com 这里可以优化简历,模拟面试,企业项目源码,最新最全大厂高并......
  • 【Java求职者的职场加速器:专业简历优化服务,助您脱颖而出】
    手机或电脑浏览器就可以打开,面霸宝典【全拼音】.com这里可以优化简历,模拟面试,企业项目源码,最新最全大厂高并发面试题,项目场景题,算法题,底层原理题在Java编程的征途上,您已积累了丰富的技术经验和项目成果,但面对激烈的职场竞争,如何让自己的简历在众多求职者中脱颖而出,成为......