Java面试题之消息队列

简介: MQ的题目在面试和笔试中很常见,所以得用心去准备一下,挑关键点进行解答即可,就在考察实现原理这块时,也不可能说百分之百的记住每一个步骤,大体的流程知道就可以了。

微信截图_20220531173728.png

一.题目介绍


1.题目来源


实际面试中遇到,形式的话有书面解答也有口述


2.题目


1)消息队列是什么?


2)你了解的消息队列有哪些?


3)消息队列在实际的开发中使用消息队列处理哪些业务,你使用消息队列遇到了哪些问题并且是如何解决的?


4)说说消息队列的实现原理


二.具体解答


1.消息队列是什么


消息队列就是一个使用队列来通信的组件。

这话有点笼统和拗口,简单来说消息队列就是在服务与服务之间传递消息的中转站,消息的发起方叫生产者,消息的接收方叫消费者,而我们可以利用这个中转站对其中的消息进行一系列的处理,在实际的业务场景中消息队列一般是起到系统解耦,流量削峰以及延时推送,


2.消息队列有哪些


这个就直接上图了,图文比较清楚,还有性能上的对比

微信截图_20220531195232.png


3.消息队列的运用


1)系统解耦

在实际的开发中,一个系统与另外一个系统之间的通信,一般是采用RPC也就是接口调用的方式(Dubbo),还有一种就是Http形式的调用, Spring Cloud Feign本质上也是基于Http形式的接口调用,那如果这个是应该微服务体系的架构,并且项目是前置项目那就需要去调用很多的接口,这样就容易出现一个情况,在注册中心挂掉以后,接口不可用的情况下,业务数据是没法从前置系统到达后面处理业务的各个系统的,就会出现数据丢失的情况,如果还是高峰并发期很可能影响到整个系统的正常运行,那可以怎么办呢?消息队列可以解决这个问题,使用消息队列后系统与系统之间传递的是消息而不用互相调用接口,实现系统解耦,另外就是可以避免一些老系统与新系统之间的版本问题。


2)流量削峰

先想这么一个问题,现在你手里的是一个电商项目,正在做活动,瞬时流量上千万,除了多线程和并发处理,你还能怎么优化这个系统?这种瞬时流量'冲击'过来的时候可能会使得这个微服务体系崩溃掉,有人说限流,限流确实能起到一部分作用,就像秒杀手机一样,让先进来的这部分让先购买,后面进来的排队,但是客户是没有耐心的,可能看着要排队就直接退出了,那针对这种场景,消息队列可以怎么去做?消息队列可以缓解前置系统传到后面系统的数据压力,把这种订单信息放消息队列里,后面的系统接收到消息以后陆续处理,可以很大程度上的缓解系统压力。


3)延时推送&消息必达

这是个老生常谈的问题了,需要实现短消息推送和订单超时取消时就可以使用消息队列去做,而所谓的消息必达指的是消息队列的ACK机制,但是消息真的就是必达吗?还有消息会丢失这种情况会发生。


4)问题及解决方案

消息丢失:ACK机制和死信队列

消息重复:目前MQ没法保证消息不重复,期待后续的更新,业务场景里可以使用幂等去保证消息不重复,比如不会同一个订单发送两条通知消息

处理消息堆积:有时候消息可能产生堆积,那就得需要定时查看控制台并及时处理


4.消息队列的实现原理


从生产者和消费者的角度:


生产者发送消息


1.生产者连接到 RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel)


2.生产者声明一个交换器,并设置相关属性,比如交换机类型、是否持久化等


3.生产者声明一个队列并设置相关属性,比如是否排他、是否持久化、是否自动删除等


4.生产者通过路由键将交换器和队列绑定起来


5.生产者发送消息至 RabbitMQ Broker,其中包含路由键、交换器等信息


6.相应的交换器根据收到的路由键查找相匹配的队列


7.如果找到,则将从生产者发送过来的消息存入相应的队列中


8.如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者


9.关闭信道


10.关闭连接


消费者接收消息的过程


1.消费者连接到 RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel)


2.消费者向 RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数,以及做一些准备工作


3.等待 RabbitMQ Broker 回应并投递相应队列中的消息,消费者接收消息


4.消费者确认(ack)接收到的消息


5.RabbitMQ 从队列中删除相应已经被确认的消息


6.关闭信道


7.关闭连接


三.题后思考


MQ的题目在面试和笔试中很常见,所以得用心去准备一下,挑关键点进行解答即可,就在考察实现原理这块时,也不可能说百分之百的记住每一个步骤,大体的流程知道就可以了。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
4月前
|
安全 架构师 Java
Java大厂面试高频:Collection 和 Collections 到底咋回答?
Java中的`Collection`和`Collections`是两个容易混淆的概念。`Collection`是集合框架的根接口,定义了集合的基本操作方法,如添加、删除等;而`Collections`是一个工具类,提供了操作集合的静态方法,如排序、查找、同步化等。简单来说,`Collection`关注数据结构,`Collections`则提供功能增强。通过小王的面试经历,我们可以更好地理解这两者的区别及其在实际开发中的应用。希望这篇文章能帮助你掌握这个经典面试题。
96 4
|
6月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
179 2
|
2月前
|
缓存 安全 Java
java面试-基础语法与面向对象
本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。
62 15
|
4月前
|
Java 程序员
Java社招面试中的高频考点:Callable、Future与FutureTask详解
大家好,我是小米。本文主要讲解Java多线程编程中的三个重要概念:Callable、Future和FutureTask。它们在实际开发中帮助我们更灵活、高效地处理多线程任务,尤其适合社招面试场景。通过 Callable 可以定义有返回值且可能抛出异常的任务;Future 用于获取任务结果并提供取消和检查状态的功能;FutureTask 则结合了两者的优势,既可执行任务又可获取结果。掌握这些知识不仅能提升你的编程能力,还能让你在面试中脱颖而出。文中结合实例详细介绍了这三个概念的使用方法及其区别与联系。希望对大家有所帮助!
258 60
|
3月前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
203 14
|
3月前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
86 13
|
4月前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
153 16
|
4月前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
177 9
|
4月前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
135 12
|
4月前
|
监控 Dubbo Java
Java Dubbo 面试题
Java Dubbo相关基础面试题

热门文章

最新文章