【RabbitMQ】面试题

news2024/11/16 19:34:46

在本篇文章中,主要是介绍RabbitMQ一些常见的面试题。对于前几篇文章的代码,都已经在码云中给出,链接是mq-test: 学习RabbitMQ的一些简单案例 (gitee.com),如果存在问题的话欢迎各位提出,望共同进步。

MQ的作用以及应用场景

简单来说,MQ的全称是Message Queue(消息队列),因此MQ的作用就是接收消息和发送消息。具体来说,MQ就是一种应用程序间的通信方法,它允许组件以异步的方式进行交互,在不同的应用场景下发挥着不同的作用。

常见的应用场景有:异步解耦、削谷削峰、消息分发、延迟通知、异步通信等。

具体介绍见【RabbitMQ】概述一文。

不同MQ的区别

业界也有许多MQ的产品,例如Kafka、RabbitMQ、RocketMQ等。

Kafka一开始是作为日志收集和传输,追求高吞吐量,性能卓越。单机吞吐量一般可达十万级,在日志领域较为成熟。但是功能比较简单,只支持简单的MQ功能。适合大数据处理、实时分析、日志聚合等应用场景。

RabbitMQ是采用Erlang语言开发,功能较为完善,几乎支持所有的主流语言,开源提供的界面非常友好,性能较好,单机吞吐量一般可达万级,社区活跃度较高,文档更新频繁。比较适合中小型公司,数据量没那么大、并且并发没那么高的场景。

RocketMQ是阿里巴巴开源的一款消息队列,后来捐赠给Apache公司,采用Java语言开发。在可用性、可靠性以及稳定性方面都非常出色,吞吐量可达十万级,在阿里巴巴内部广泛使用。但是支持的语言并不多,产品较新文档较少,并且社区活跃度一般。适合于大规模分布式系统,而且可靠性要求较高的场景,比如互联网金融。

具体介绍见【RabbitMQ】概述一文。

RabbitMQ的核心概念

 核心概念这一问题可以大概构建上述图形来简单进行介绍,我习惯先介绍生产者、消费者,然后再介绍连接、信道,最后介绍Broker以及其中的内容,VirtualHost、Exchange、Queue。

  • Producer(生产者):是RabbitMQ Server的客户端,向RabbitMQ Server发送消息。
  • Consumer(消费者):是RabbitMQ Server的客户端,从RabbitMQ Server接收消息。
  • Connection(连接):是RabbitMQ Server和客户端之间的一个TCP连接,该连接是客户端和服务端之间发送消息的基础,他负责传输客户端和服务端之间的所有数据和控制信息。
  • Channel(信道、通道):信道是连接之上的一个抽象层。在一个连接中有多个信道,每个信道都是独立的虚拟连接,消息的发送和接收就是基于信道的。信道的主要作用是将消息的读写操作复用到同一个TCP连接上,这样就可以减少建立连接和关闭连接的开销,提高性能。
  • Broker:本质上就是RabbitMQ Server这个服务端实例,主要用来接收和发送消息。
  • VirtualHost(虚拟主机):虚拟主机是一个虚拟概念,他为消息队列提供了一种逻辑上的隔离机制。对于一个RabbitMQ Server而言,可以存在多个虚拟主机。当多个不同的用户需要同一个Rabbit Server提供的服务时,可以划分出多个虚拟主机。每个用户在自己的虚拟主机上创建交换机、队列即可。
  • Exchange(交换机):消息到达Broker的第一站,她负责接收消息并且根据路由规则把消息路由到对应的消息队列中。交换机起到了消息路由的作用,她根据交换机的规则和类型来确认如何转发接收到的消息。
  • Queue(队列):用于存储消息。

具体介绍见【RabbitMQ】概述一文。

RabbitMQ的工作流程

  1. 发送消息:生产者生成了一条消息。
  2. 创建连接:生产者和RabbitMQ Server之间创建连接,并且开启一个信道。
  3. 声明交换机、队列以及绑定关系:生产者声明一个队列,用来存放消息;生产者声明一个交换机,用来路由消息;生产者指定一个绑定规则,使得消息从交换机成功路由到队列中。
  4. 发送消息:生产者将消息发送给RabbitMQ Server。
  5. 消息存储:RabbitMQ Server接收到消息之后,根据路由规则存入相应的队列中。如果未找到相应的队列,根据生产者的配置,选择丢弃或者回退给生产者。
  6. 消费消息:消费者监听队列,当消息到达时,从队列中获取消息。处理后,向Rabbit Server发送消息确认。
  7. 删除消息:RabbitMQ Server接收到消费者的确认(ACK)之后,从队列中把消息删除。

具体介绍见【RabbitMQ】概述一文。

RabbitMQ如何保证消息的可靠性

如何保证消息的可靠性,就要看消息在传输过程中哪里出现了问题。大致分为三个方面:第一个是从生产者到交换机、再到队列的过程,第二个是RabbitMQ Server内部,第三个是从RabbitMQ Server内部到消费者的过程。RabbitMQ对这三种情况分别推出了三种解决方案:发送方确认、持久化以及消息确认。

发送方确认有两种模式:第一个是confirm模式,保证的是从生产者到交换机过程中的消息可靠性。第二个是return模式,保证的是从交换机到队列的消息可靠性。

持久化有三种方式,分别是交换机持久化、队列持久化以及消息持久化。在三个持久化中,主要注意的是队列持久化和消息持久化,如果消息持久化了但是队列没持久化是没有作用的,比较队列都没有,消息也没地方放,自然持久化也就没有用。

消息确认有两种模式:手动确认和自动确认,在SpringAMPQ中,则是有三种策略可以选择:NONE、AUTO、MANUAL。在MANUAL中,又有三种机制可供选择,分别是接收、拒绝以及批量拒绝。

具体介绍见【RabbitMQ】可靠性传输​​​​​一文。

RabbitMQ如何保证消息的顺序性

RabbitMQ中顺序性指的是生产者生产消息的顺序为msg1、msg2、msg3,那么消费者消费消息的顺序也应该依次为msg1、msg2、msg3。顺序性保障分为局部顺序性保障和全局顺序性保障。存在的解决方案有:单队列单消费者、分区消费、消息确认、业务逻辑控制(例如消费端内部实现消息排序逻辑等)。

具体介绍见【RabbitMQ】幂等性、顺序性一文。

RabbitMQ如何保证消息的幂等性

RabbitMQ中幂等性指的是一条消息,多次消费,对系统产生的影响是相同的。

在消息传递过程中,消息传输保证被分为最少一次、恰好一次、最多一次。RabbitMQ并不支持恰好一次;在业务场景比较重要的情况下,建议使用最少一次,但是在一些特殊场景下(例如消息从生产者发送出去之后出现网络故障,导致服务端没有及时返回确认机制;或者消息从服务端到消费者,消费之后并没有返回确认通知)会导致消息重复发送,从而出现一些比较严重的问题;对于最多一次来说,则会因为网络宕机等故障导致消息丢失。

一般在比较重要的业务下,我们都是以最少一次这种方式,但是如果出现消息重复传输的话,就会导致消息多次消费,因此我们为了保证幂等性,就需要一些解决方案。常见的解决方案有:

  • 使用唯一标识符来标识每一条消息
  • 使用业务逻辑判断来确认消息是否消费

具体介绍见【RabbitMQ】幂等性、顺序性一文。

RabbitMQ有哪些特性

  • 消息可靠性传输
    • 发送方确认
    • 持久化
    • 消息确认
  • 死信队列
  • 延迟队列
  • 重试机制
  • TTL

具体介绍见【RabbitMQ】系列。

介绍下RabbitMQ的死信队列

死信表示一系列无法被消费的消息。存在死信,就存在死信队列。当一个消息在队列中变成死信之后,就会通过死信交换机进入死信队列,这就是死信队列的由来。

例如队列中的消息超过最大长度、消息的TTL超时、手动确认机制下拒绝并且不予重新入队等等,都会被路由到死信队列中。

死信队列的应用场景有:消息重试(将错误的消息放入死信队列中进行重试)、日志分析(将死信队列中的消息进行收集,用户日志分析)、消息丢弃(将死信队列中的消息丢弃,避免占用资源)。

具体介绍见【RabbitMQ】死信队列、延迟队列一文。

介绍下RabbitMQ的延迟队列

延迟队列表示消息从生产者到达RabbitMQ Server之后,并不是立即到达消费者进行消费,而是经过一段时间之后再推送到消费者。

延迟队列的实现方式有两种:

  1. TTL + 死信队列(注意这里的TTL必须要设置队列的,而不是消息的)。
  2. 使用延迟队列插件。

延迟队列的应用场景有:

  • 十五分钟未支付订单取消
  • 预定会议开始前十五分钟进行通知
  • 手机遥控两个小时之后家电开始工作
  • 用户注册成功之后,三天后发送通知,提供用户活跃度
  • 用户发起退款,24小时之后商家没有行动,自动退款

具体介绍见【RabbitMQ】死信队列、延迟队列一文。

介绍下RabbitMQ的工作模式

RabbitMQ有七种工作模式,分别是:

  • 简单模式(Simple)
  • 工作队列模式(Work Queue)
  • 发布订阅模式(Publish / Subscribe)
  • 路由模式(Routing)
  • 通配符模式(Topics)
  • RPC模式(RPC)
  • 发布确认模式(Publisher Confirms)

具体介绍见【RabbitMQ】工作模式一文。

消息积压

消息积压指的是生产者生产消息的速度已经远远超过了消费者消费消息的速度,从而导致了消息在队列中发生了积压。

导致消息积压的原因无非就是软件和硬件的原因。对于软件来说,就是生产者生产速度太快、而消费者消费速度太慢;对于硬件来说,就是网络延迟、RabbitMQ服务器配置太低等原因。

想要解决消息积压,就是针对产生的问题进行分别解决。对于软件来说,就是提高消费者消费速率、降低生产者生产速率;对于硬件来说,就是增加服务器配置、优化参数等方案。

具体介绍见【RabbitMQ】消息积压、推拉模式一文。

推拉模式

推拉模式是RabbitMQ中向消费者发送消息的两种模式。推模式表示的是消息到达服务器之后,根据消费者监听的队列将消息推送给消费者进行消费。拉模式表示的是消息到达服务器之后,消费者主动去服务器拉取消息进行消费。

对于一般的业务来说,采取的都是推模式进行工作,其适合数据实时性要求较高的场景。拉模式则是适合消费消息时需要大量资源的的任务,拉模式允许消费者准备好之后再去进行消费,可以减少资源的浪费。

具体介绍见【RabbitMQ】消息积压、推拉模式一文。

到这里,RabbitMQ的介绍就基本结束了,其中缺的一个内容就是分布式部署,有机会的话后续进行介绍。

总的来说,在RabbitMQ这个系列中,先进行了一个概述,然后对工作模式简单介绍,后续是对高级特性(可靠性保证、TTL、重试机制、延迟队列、死信队列、事务、消息分发、幂等性、顺序性、消息积压)以及推拉模式进行了介绍,最后对一些场景面试题进行了概述。

下一个系列文章是微服务组件,欢迎大家给出修改意见,共同进步。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速上手Make Sense:在线标注数据集的强大工具

链接: Makesense汉化版本 Makesense英文版 随着深度学习在计算机视觉领域的广泛应用,数据集标注成为了一项重要的任务。Make Sense正是一个为图像数据集提供标注功能的在线工具。其易用性和强大的功能使得它在众多标注工具中脱颖而出。本文将为你详细介绍…

找不到msvcr100.dll怎么解决?总结6个有效的解决方法

在使用计算机的过程中,我们经常会遇到一些错误提示,其中之一就是“msvcr100.dll丢失”。这个问题可能会让我们感到困惑和无助,但是不用担心,本文将为大家介绍六种实用的解决方法,帮助你轻松解决这个问题。 一&#xff…

raylib实现生产者消费者模型增加缓冲提高帧率

原来增加了四叉树导致帧率下降 后来学了生产者消费者模型&#xff0c;尝试追加缓冲池&#xff0c;剥离主函数查找需要更新的数据 帧率上升稳定到60帧 多了10 帧 中间工程主要是探索数据结构体怎么安排 // 参考自 https://zhuanlan.zhihu.com/p/693482704 #include <stdio.…

C语言-进程

一,进程的基本认识 1,进程的简介 进程描述是一个程序执行过程。当程序执行后&#xff0c;执行过程开始&#xff0c;则进程产生&#xff1b;执行过程结束&#xff0c;则进程也就结束了.进程和我们普通电费程序最大的区别就是,进程是动态的,他是一个过程,而程序是静态的. 2,进程…

永辉超市自救三部曲:靠名创优品复制胖东来?如何避免另一个苏宁易购?

《港湾商业观察》施子夫 王璐 从潮流产品新锐向大型商超迈入&#xff0c;没有人想到名创优品(09896.HK&#xff1b;MNSO.US)会成为永辉超市&#xff08;601933.SH&#xff09;的第一大股东。 近63亿元的收购价让两家本就知名度颇高的企业在2024年的商业江湖中更加瞩目。然而…

​极狐阿尔法 S5安全至上,北汽极狐打造移动防护堡垒

在新能源汽车的广阔舞台上&#xff0c;北汽极狐以其卓越的品质和创新的技术&#xff0c;不断书写着辉煌篇章。其中&#xff0c;极狐阿尔法 S5更是以其强大的性能、豪华的配置和亲民的价格&#xff0c;成为了众多消费者关注的焦点。 北汽极狐的品质追求 北汽极狐一直以来都将品…

【蓝牙小知识集锦!】禁止电脑连接蓝牙如何操作?一分钟教你5种小妙招!

禁止电脑连接蓝牙如何操作&#xff1f; 在回答如何禁止电脑连接蓝牙这个问题之前&#xff0c;我们要先了解&#xff0c;企业为啥要禁止蓝牙&#xff1f;原因是什么&#xff1f; 一、禁止蓝牙连接的原因 它可以涉及多个方面&#xff0c;主要包括安全性、效率、能源管理以及避免…

matlab r2024a、matlab R2024b保姆级安装教程

​ 1.安装步骤 右键【setup.exe】以【管理员身份运行】 点击【高级选项】-【我有文件安装密钥】 点击【是】-【下一步】 输入密钥【21471-07182-41807-00726-32378-34241-61866-60308-44209-03650-51035-48216-24734-36781-57695-35731-64525-44540-57877-31100-06573-50736-…

【论文速看】DL最新进展20240927-目标检测、Transformer

目录 【目标检测】【Transformer】 【目标检测】 [2024小目标检测] A DeNoising FPN With Transformer R-CNN for Tiny Object Detection 论文链接&#xff1a;https://arxiv.org/abs/2406.05755 代码链接&#xff1a;https://github.com/hoiliu-0801/DNTR 尽管计算机视觉领域…

信息学奥赛复赛复习05-CSP-J2020-01优秀的拆分-对数函数、自然对数、以2为底的对数、幂函数、打表

PDF文档回复:20240927 1 2020 CSP-J 题目1 优秀的拆分 [题目描述] 一般来说&#xff0c;一个正整数可以拆分成若干个正整数的和 例如&#xff0c;11&#xff0c;101234 等。对于正整数 n的一种特定拆分&#xff0c;我们称它为“优秀的”&#xff0c;当且仅当在这种拆分下&am…

【Redis】安装redis-plus-plus

目录 安装redis-plus-plus 安装hiredis 安装redis-plus-plus本体 具体步骤 ​编辑编写一个hello程序 安装redis-plus-plus C操作redis的第三方库有很多&#xff0c;咱们此处使用redis-plus-plus&#xff0c;安装链接如下&#xff1a; GitHub - sewenew/redis-plus-plus: …

gitee windows/linux配置使用

1、安装git工具 地址&#xff1a;git工具安装地址 1.2在gitee上创建仓库 在浏览器中打开Gitee网站&#xff0c;并登录到您的账户。点击页面右上方的加号图标&#xff0c;然后选择“新建仓库”。输入仓库的名称、描述和其他相关信息&#xff0c;然后点击“创建仓库”按钮。添…

大势Inside | “郧县人”重大考古成果写入人教版初中历史教科书

近日&#xff0c;发掘于湖北十堰郧阳的“郧县人”考古成果被写入2024年秋人教版历史教科书&#xff08;七年级上册&#xff09;第一课“远古时期的人类活动”&#xff0c;与闻名中外的“元谋人”、“蓝田人”、“北京人”、“山顶洞人”并列。 人教版七年级上册中国历史教科书 …

基于SSM的图书管理管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的图书管理管理系统4拥有两种角色&#xff0c;用户可以浏览评论图书、登录注册&#xff0c;管理员可以进行图书馆管理、用户管理、分类管理等功能 1.1 背景描述 图书书店销售管理…

基于Hadoop的NBA球员大数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

Meta的LLaMA 3.2系列大模型打败OpenAI,Orion的原型AR眼镜更是引领科技新时代!

Meta公司推出的LLaMA 3.2系列模型在人工智能领域引起了广泛关注。这些模型包括了多种尺寸&#xff0c;从适合移动应用和边缘设备的轻量级模型&#xff08;1B和3B参数版本&#xff09;到功能强大的90B视觉模型&#xff0c;后者支持文本和图像处理任务&#xff0c;如图像字幕、文…

腾讯邮箱上传附件卡、慢、无法上传,下载慢问题处理

1、检查文件中转站容量是否已满 2、建议用户打开链接https://exmail.qq.com/qy_mng_logic/wasmHelper?typehashv2&#xff0c;看是否可以正常访问。&#xff08;能打开下载就表示可以正常访问&#xff09; 3、让用户切换到4G或者其他网络再重新上传附件是否会重现问题&#xf…

Mac制作Linux操作系统启动盘

前期准备 一个 Mac 电脑 一个 U 盘&#xff08;8GB 以上&#xff09; 下载好 Linux 系统镜像&#xff08;iso 文件&#xff09; 具体步骤 挂载 U 盘 解挂 U 盘 写系统镜像到 U 盘 完成 一、挂载 U 盘 首先插入 U 盘&#xff0c;打开终端输入下面的命令查看 U 盘是否已经 m…

python -tkinter

在Button的command绑定中&#xff0c;如果给的一个函数&#xff0c;则表示执行一次。 import tkinter as Tkfrom tkinter import messageboxi 0def myLabel():global root,is Tk.Label(root,text"the import thing is :" )s.pack()root Tk.Tk()def fun1():if mess…

一文系统了解软件检测实验室CNAS认可,文件依据、资源准备、流程、预算

软件检测实验室获取CNAS认可不但可以提升实验室的权威度和社会认可度&#xff0c;在部分区域还可以拿到相关补贴资金。 一、软件检测实验室CNAS认可依据 CNAS-R01&#xff1a;2023《认可标识使用和认可状态声明规则》 CNAS-R02&#xff1a;2023《公正性和保密规则》 CNAS-R…