RabbitMQ 面试题(一)
1. 简述为什么要使用 RabbitMQ ?
使用 RabbitMQ 的主要原因包括以下几点:
- 解耦:在复杂的系统中,不同的服务或组件之间往往需要通信和协作。RabbitMQ 作为消息队列,允许这些组件或服务通过发送和接收消息来交互,而无需直接依赖对方。这样,系统组件之间的耦合度大大降低,提高了系统的可维护性和可扩展性。
- 异步通信:RabbitMQ 支持异步通信模式,即发送方发送消息后无需等待接收方处理完成,可以继续执行其他任务。这种异步通信方式提高了系统的响应速度和吞吐量,特别适用于需要处理大量并发请求的场景。
- 流量削峰:在高并发场景下,系统可能会面临大量的请求涌入。RabbitMQ 可以作为缓冲区,将一部分请求暂时存储起来,然后按照一定的速率逐步处理这些请求,从而避免系统因瞬间压力过大而崩溃。
- 数据一致性:RabbitMQ 可以确保消息在传输过程中的可靠性,例如通过持久化消息、确认机制等确保消息不会丢失或被重复处理。这有助于维护系统数据的一致性。
- 可扩展性:RabbitMQ 支持集群部署,可以方便地扩展处理能力。当系统需要处理更多的消息时,可以通过增加更多的 RabbitMQ 节点来提高系统的吞吐量和处理能力。
- 灵活性:RabbitMQ 提供了丰富的消息路由和过滤机制,可以根据不同的业务需求灵活配置消息队列、交换机和绑定关系。这使得 RabbitMQ 可以适应各种复杂的业务场景。
综上所述,RabbitMQ 在降低系统耦合度、提高异步通信能力、削峰填谷、保障数据一致性、提高可扩展性以及提供灵活的路由和过滤机制等方面具有显著优势,因此被广泛应用于各种分布式系统中。
2. 简述RabbitMQ的组织架构 ?
RabbitMQ的组织架构主要包括以下几个核心组件:
- 服务器:RabbitMQ服务器是RabbitMQ的核心组件,负责管理所有的交换器和队列。一个RabbitMQ实例可以包含多个服务器,每个服务器负责一部分交换器和队列。服务器之间通过HTTP协议进行通信,可以使用多种方式进行部署,如单机、集群、云服务等。
- 交换器:交换器是RabbitMQ中的消息传递核心,负责接收、路由、传递消息。RabbitMQ支持多种交换器类型,如fanout(扇出)、direct(直连)、topic(主题)等,每种类型的交换器都有不同的消息传递方式和应用场景。
- 队列:队列是RabbitMQ中的消息存储容器,用于存储消息。RabbitMQ支持多种队列类型,如持久化、非持久化、排他访问等,每种类型的队列都有不同的存储方式和应用场景。
此外,RabbitMQ的架构还涉及以下重要概念:
- 生产者(Producer):负责产生消息并发送到RabbitMQ服务器。消息可以包含任何类型的数据,例如JSON、XML等。生产者通过TCP连接到RabbitMQ进行通信,创建AMQP信道,并将消息发布到RabbitMQ。
- 消费者(Consumer):连接到RabbitMQ服务器,并订阅到队列上,接收来自队列的消息进行处理。消费者在接收消息时,只接收消息体部分,标签在消息路由的过程中已经被丢弃。
- 绑定(Binding):用于将交换器和队列连接起来,定义了消息的路由规则。
这些组件和概念共同构成了RabbitMQ的组织架构,使其能够高效地处理消息传递和存储任务。在实际应用中,根据具体需求,可以选择适合的交换器类型、队列类型以及部署方式,以实现高效、可靠的消息传递。
3. 简述RabbitMQ的优点 ?
RabbitMQ作为一款流行的消息队列服务,具有诸多优点,这些优点使其在构建分布式系统时成为首选之一。以下是RabbitMQ的主要优点:
-
高可靠性:RabbitMQ支持消息的持久化,即使在服务器重启或崩溃的情况下,也能确保消息不会丢失。此外,RabbitMQ还提供了多种机制来确保消息的可靠传输,如消息确认、重试机制等,从而保证了消息传递的可靠性。
-
灵活的路由和过滤:RabbitMQ提供了多种交换机类型(如直接交换机、主题交换机等),允许用户根据业务需求灵活配置消息的路由规则。同时,它还支持消息的过滤和绑定,使得消息能够精确地发送到目标队列,实现精确的消息传递。
-
高性能:RabbitMQ采用Erlang语言编写,具有出色的并发性能和稳定性。它支持大量的并发连接和消息传递,能够满足高并发场景下的需求。此外,RabbitMQ还提供了多种优化手段,如批量发送、预取消息等,进一步提高了消息传递的性能。
-
可扩展性:RabbitMQ支持集群部署,可以方便地扩展处理能力。通过添加更多的节点,可以提高系统的吞吐量和处理能力,满足不断增长的业务需求。此外,RabbitMQ还支持跨地域的部署和容灾备份,确保服务的高可用性和稳定性。
-
易于集成:RabbitMQ提供了丰富的客户端库和API,支持多种编程语言和框架。这使得开发者可以轻松地将其集成到现有的系统中,实现与其他组件或服务的通信和协作。
-
强大的社区支持:RabbitMQ拥有庞大的用户群体和活跃的社区支持,这使得在使用过程中遇到的问题可以得到及时解决。同时,社区还提供了大量的教程、案例和最佳实践,帮助开发者更好地理解和使用RabbitMQ。
综上所述,RabbitMQ以其高可靠性、灵活的路由和过滤、高性能、可扩展性、易于集成以及强大的社区支持等优点,在构建分布式系统时发挥着重要作用。
4. 简述RabbitMQ的缺点 ?
RabbitMQ作为一个流行的消息队列系统,尽管具有许多优点,但也存在一些缺点。以下是RabbitMQ的一些主要缺点:
-
资源消耗:RabbitMQ在运行过程中会消耗较多的系统资源,包括内存和CPU。在高并发或大量数据处理的情况下,RabbitMQ的性能可能会受到影响,需要更多的硬件资源来支撑。
-
学习曲线陡峭:RabbitMQ的配置和管理相对复杂,对于初学者来说,可能需要花费一定的时间和精力来学习和理解其架构和工作原理。此外,RabbitMQ的文档和社区支持虽然丰富,但也可能存在一定的学习门槛。
-
扩展性限制:虽然RabbitMQ支持集群模式以实现高可用性和扩展性,但在某些场景下,其扩展性可能受到一定限制。例如,当集群中的节点数量过多时,管理和维护可能会变得复杂,且性能瓶颈也可能出现。
-
客户端支持:RabbitMQ的客户端支持主要集中在主流编程语言和框架上,对于某些特定的技术栈或平台,可能缺乏直接的客户端支持。这可能导致在某些场景下需要额外的开发工作来集成RabbitMQ。
-
依赖性问题:RabbitMQ依赖于Erlang语言运行,而Erlang并非主流的开发语言。这可能导致在某些环境中安装和配置RabbitMQ时遇到依赖性问题,增加了部署和运维的复杂性。
需要注意的是,以上缺点并非RabbitMQ独有,许多消息队列系统都存在类似的问题。在选择消息队列系统时,需要根据具体的业务需求和场景来权衡各种因素,选择最适合自己的解决方案。
5. 简述Exchange交换器的类型 ?
RabbitMQ的Exchange(交换器)是消息路由的核心组件,它负责接收生产者发送的消息,并根据一定的规则将消息路由到相应的队列。RabbitMQ提供了多种类型的Exchange,以满足不同的业务需求。以下是几种常用的Exchange类型:
- direct(直连):这是最常用且默认的Exchange类型。当使用direct类型的Exchange时,队列需要通过routing key(路由键)与Exchange进行绑定。生产者发送消息时也需要指定routing key,Exchange会根据routing key将消息路由到相应的队列。只有当队列的routing key与消息的routing key完全匹配时,消息才会被投递到该队列。
- fanout(广播):fanout类型的Exchange会将所有发送到该Exchange的消息路由到所有与该Exchange绑定的队列中,而不考虑routing key。这种类型适用于需要将消息广播到多个队列的场景。
- topic(主题):topic类型的Exchange与direct类型类似,都使用routing key进行消息的路由。但是,topic类型的routing key支持通配符匹配,这使得它更加灵活。队列在绑定到Exchange时,可以指定一个模式(例如“*.logs”),然后只有那些routing key与该模式匹配的消息才会被路由到该队列。
- headers(头部):headers类型的Exchange不依赖于routing key进行消息的路由,而是根据发送消息的内容中的headers属性进行匹配。在绑定队列和Exchange时,需要指定一组键值对,当发送消息到Exchange时,RabbitMQ会根据这些键值对进行匹配,将消息路由到相应的队列。然而,headers交换器在实际使用中性能较差,因此并不常用。
除了上述四种常用类型外,AMQP协议还提到了另外两种类型:System和自定义类型。但在实际应用中,前四种类型已经能够满足大部分场景的需求。
在选择Exchange类型时,应根据具体的业务需求和场景进行选择,以确保消息能够正确、高效地路由到目标队列。
6. 简述RabbitMQ消息发送过程 ?
RabbitMQ的消息发送过程主要涉及生产者、RabbitMQ服务器以及交换器和队列等关键组件。以下是RabbitMQ消息发送过程的简要描述:
-
生产者连接:首先,生产者应用程序需要连接到RabbitMQ服务器。这通常是通过建立TCP连接并创建一个AMQP(高级消息队列协议)信道来完成的。
-
声明交换器和队列:在发送消息之前,生产者需要声明一个或多个交换器和队列。交换器负责接收消息并根据路由规则将其分发到相应的队列。队列是存储消息的容器,等待消费者进行消费。
-
发送消息:生产者将消息发送到声明的交换器。消息通常包含有效负载(即实际的数据)以及可选的元数据(如路由键、消息属性等)。路由键用于确定消息应如何路由到队列。
-
路由消息:交换器根据消息的路由键和其绑定规则,将消息路由到一个或多个队列。具体的路由方式取决于交换器的类型(如fanout、direct、topic等)。
-
存储消息:一旦消息被路由到队列,它们将被存储在队列中,等待消费者进行消费。RabbitMQ使用持久化机制来确保即使在服务器崩溃的情况下,消息也不会丢失。
-
确认发送:RabbitMQ服务器在成功接收并处理消息后,会向生产者发送一个确认消息。这有助于确保消息的可靠传输和避免数据丢失。
-
关闭连接:当生产者完成消息发送后,它会关闭与RabbitMQ服务器的连接。这释放了相关资源,并允许生产者应用程序继续执行其他任务。
需要注意的是,这个过程是异步的,生产者发送消息后不必等待消费者接收消息就可以继续执行其他操作。此外,RabbitMQ还提供了许多高级特性,如消息持久化、消息确认、死信队列等,以增强消息传递的可靠性和灵活性。
总结起来,RabbitMQ的消息发送过程涉及生产者连接、声明交换器和队列、发送消息、路由消息、存储消息以及确认发送等步骤。这个过程确保了消息能够可靠地从生产者传输到RabbitMQ服务器,并最终路由到正确的队列以供消费者消费。
7. 简述RabbitMQ消息接受过程 ?
RabbitMQ的消息接收过程涉及多个步骤和组件的协同工作。以下是该过程的简要概述:
-
消费者连接与通道创建:
- 消费者首先连接到RabbitMQ服务器。
- 一旦连接建立,消费者会创建一个通道(Channel)。通道是消费者与RabbitMQ服务器之间通信的桥梁,它负责发送和接收消息。
-
声明队列与设置属性:
- 消费者通过通道声明一个队列。在声明队列时,消费者可以设置一系列属性,如队列是否持久化(即是否在服务器重启后仍然保留)、是否排他(即仅允许声明它的连接使用)、是否自动删除(即当没有消费者时是否自动删除队列)等。
-
订阅队列:
- 消费者订阅之前声明的队列,表示对该队列中的消息感兴趣。
-
接收消息:
- 一旦消费者订阅了队列,它就会开始从队列中接收消息。这些消息是生产者之前发送到RabbitMQ并通过Exchange路由到该队列的。
-
处理与确认消息:
- 消费者接收到消息后,会根据其业务逻辑对消息进行处理。
- 处理完消息后,消费者需要向RabbitMQ发送确认信号(Ack),表示已经成功处理该消息。RabbitMQ在收到确认信号后,通常会将该消息从队列中删除。
- 如果消费者在处理消息时遇到问题(如崩溃或处理失败),它可以选择不发送确认信号或发送一个拒绝信号(reject)。在这种情况下,RabbitMQ会在一段时间后重新将消息发送到队列中,以便其他消费者可以尝试处理。
通过这个过程,RabbitMQ确保了消息的可靠传递和处理,同时支持了消费者的并发处理和消息的持久化存储。这使得RabbitMQ成为构建分布式系统和微服务架构中消息传递的理想选择。
相关文章:

RabbitMQ 面试题(一)
1. 简述为什么要使用 RabbitMQ ? 使用 RabbitMQ 的主要原因包括以下几点: 解耦:在复杂的系统中,不同的服务或组件之间往往需要通信和协作。RabbitMQ 作为消息队列,允许这些组件或服务通过发送和接收消息来交互,而无…...

org.postgresql.util.PSQLException: 错误: 关系 “dual“ 不存在
springboot 项目连接 postgreps,启动时报错 org.postgresql.util.PSQLException: 错误: 关系 "dual" 不存在。 查阅资料后发现这是由配置文件中的配置 datasource-dynamic-druid-validationQuery 导致的 spring:datasource:druid:stat-view-servlet:ena…...

mysql权限分类
USAGE --无权限,只有登录数据库,只可以使用test或test_*数据库 ALL --所有权限 select/update/delete/super/slave/reload --指定的权限 with grant option --允许把自己的权限授予其它用户(此用户拥有建立账号的权限) 权限级别: 1、. --全…...

【C++11】列表初始化、右值引用的详细讲解(上)
前言 在一开始学C之前我们就简单的了解了一下C的发展历史。 相比较而言,C11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率加了许多特性,约140个新特性。使得C…...

【JAVA进阶篇教学】第十三篇:Java中volatile关键字讲解
博主打算从0-1讲解下java进阶篇教学,今天教学第十三篇:volatile关键字讲解。 在 Java 中,volatile关键字是一种轻量级的同步机制,用于确保变量的可见性和禁止指令重排序。本文将详细解释volatile关键字的工作原理、可见性保证以及…...

蓝桥杯-地宫取宝
X 国王有一个地宫宝库,是 nm 个格子的矩阵,每个格子放一件宝贝,每个宝贝贴着价值标签。 地宫的入口在左上角,出口在右下角。 小明被带到地宫的入口,国王要求他只能向右或向下行走。 走过某个格子时,如果那个…...

带头单链表 C++实现
节点定义 带头单链表:我们只需要一个结点指针指向整个链表的第一个节点,这样我们就可以通过next指针访问整个链表内的所有节点 template<class T> struct ListNode {T _val;ListNode* _next;ListNode(const T &val):_val(val),_next(nullptr){…...

学习c#第24天 枚举类型
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace enumType { //定义枚举 public enum Week { 星期一, 星期二, 星期三, 星期四, 星期…...

TensorFlow运行bug汇总
1、ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1 解决方案 pip install urllib31.26.15 -i https://pypi.tuna.tsinghua.edu.cn/simple 升级或者降级 (TF2.1) C:\Users\Administrator>pip install urllib31.26.15 -i https://pypi.tuna.tsinghua.edu.cn/sim…...

docker部署调度程序
Dockerfile(构建初始镜像) # python:3.8-slim-buster为精简版的python FROM python:3.8-slim-buster # 1059为组的id,newgroup为组名,1088为用户的id,newuser为新用户 RUN groupadd -g 1059 newgroup && \useradd -g -u 1088 -g newgroup -m newuser USER newuser RUN…...

websocket和http协议的区别
ws(websocket)协议和http协议是两种不同的协议。 http:http是一种用于传输超文本的应用层协议,通常用于web端浏览器和web端服务器之间传输数据。http也是基于tcp的,但是HTTP只能在同一时刻单向发送消息,是一种半双工通信。&#…...

CSS之定位
目录 CSS定位为什么需要定位定位组成定位的叠放顺序拓展 CSS定位 为什么需要定位 浮动可以让多个块级盒子一行没有缝隙排列显示,经常用于横向排列盒子定位则是可以让盒子自由的在某个盒子内移动位置或者固定屏幕中的某个位置,并且可以压住其他盒子 定…...

[IM002][Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
解决办法: 安装驱动 下载 ODBC Driver for SQL Server - ODBC Driver for SQL Server | Microsoft Learn...

神经网络复习--神经网络算法模型及BP算法
文章目录 神经网络模型的构成BP神经网络 神经网络模型的构成 三种表示方式: 神经网络的三要素: 具有突触或连接,用权重表示神经元的连接强度具有时空整合功能的输入信号累加器激励函数用于限制神经网络的输出 感知神经网络 BP神经网络 …...

【Java】/*方法的使用-快速总结*/
目录 一、什么是方法 二、方法的定义 三、实参和形参的关系 四、方法重载 五、方法签名 一、什么是方法 Java中的方法可以理解为C语言中的函数,只是换了个名称而已。 二、方法的定义 1. 语法格式: public static 返回类型 方法名 (形参列表) { //方…...

kotlin中协程相关
协程 用同步的方式写出异步的效果协程最重要的是通过非阻塞挂起和恢复实现了异步代码的同步编写方式挂起函数(suspend)不一定就是在子线程中执行的,但是通常在定义挂起函数时都会为它指定其他线程,这样挂起才有意义解决多层嵌套回调 协程不是线程&…...

(自适应手机端)物流运输快递仓储网站模板 - 带三级栏目
(自适应手机端)物流运输快递仓储网站模板 - 带三级栏目PbootCMS内核开发的网站模板,该模板适用于物流运输网站、仓储货运网站等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可;自适应手机端,同一个后台…...

Navicat导出表结构到Excel或Word
文章目录 sql语句复制到excel复制到Word sql语句 SELECTcols.COLUMN_NAME AS 字段,cols.COLUMN_TYPE AS 数据类型,IF(pks.CONSTRAINT_TYPE PRIMARY KEY, YES, NO) AS 是否为主键,IF(idxs.INDEX_NAME IS NOT NULL, YES, NO) AS 是否为索引,cols.IS_NULLABLE AS 是否为空,cols.…...

Golang编译优化——稀疏条件常量传播
文章目录 一、概述二、稀疏条件常量传播2.1 初始化worklist2.2 构建def-use链2.3 更新值的lattice2.4 传播constant值2.5 替换no-constant值 一、概述 常量传播(constant propagation)是一种转换,对于给定的关于某个变量 x x x和一个常量 c …...

人工智能培训讲师咨询叶梓介绍及智能医疗技术与ChatGPT临床应用三日深度培训提纲
1、授课老师简介 叶梓,上海交通大学计算机专业博士毕业,高级工程师。主研方向:数据挖掘、机器学习、人工智能。历任国内知名上市IT企业的AI技术总监、资深技术专家,市级行业大数据平台技术负责人。 长期负责城市信息化智能平台的…...

HCIP(BGP综合实验)--8
一:实验要求 二:实现过程 (一)配置IP地址: AR1: [AR1]int g0/0/0 [AR1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [AR1-GigabitEthernet0/0/0]int l0 [AR1-LoopBack0]ip add 172.16.0.1 32 [AR1-LoopBack0]int l1 […...

深入理解C++中的Vector容器:用容器构建高效程序
文章目录 vector介绍vector常用的成员函数有关vector定义的函数vector的迭代器使用vector关于空间操作的成员函数vector的增删查改 总结 vector介绍 在C语言的库中包含有公共数据结构的实现,C的这个部分内容就是众所周知的STL(标准模版库)&a…...

目标检测YOLO实战应用案例100讲-基于深度学习的交通场景多尺度目标检测算法研究与应用(下)
目录 3.2 基于空洞卷积的特征融合模块设计 3.3 改进k-means聚类算法的anchor尺寸优化设计...

react 类组件 和 函数组件 声明周期 对比
React 的类组件和函数组件在生命周期方面存在一些差异。以下是它们之间的对比: 类组件的生命周期 React 类组件的生命周期可以分为三个阶段:挂载、更新和卸载。 1、挂载阶段: constructor():组件实例化时调用,用于…...

智慧变电站守护者:TSINGSEE青犀AI视频智能管理系统引领行业革新
一、方案概述 随着科技的不断进步,人工智能(AI)技术已经深入到各个领域。在变电站安全监控领域,引入AI视频监控智能分析系统,可以实现对站内环境、设备状态的实时监控与智能分析,从而提高变电站的安全运行…...

【Ubuntu20.04安装java-8-openjdk】
1 下载 官网下载链接: https://www.oracle.com/java/technologies/downloads/#java8 下载 最后一行 jdk-8u411-linux-x64.tar.gz,并解压: tar -zxvf jdk-8u411-linux-x64.tar.gz2 环境配置 1、打开~/.bashrc文件 sudo gedit ~/.bashrc2、…...

HTTPS对于网站到底价值几何?
现在HTTPS基本上已经是网站的标配了,很少会遇到单纯使用HTTP的网站。但是十年前这还是另一番景象,当时只有几家大型互联网公司的网站会使用HTTPS,大部分使用的都还是简单的HTTP,这一切是怎么发生的呢? 为什么要把网站…...

Docker私有仓库Harbor
简介 Docker私有仓库Harbor是一个开源的、企业级的Docker registry解决方案,它提供了安全、可靠和高效的容器镜像存储和分发服务。以下是关于Docker私有仓库Harbor的详细介绍: 一、Harbor的特点 基于角色的访问控制(RBAC)&#…...

48. 旋转图像/240. 搜索二维矩阵 II
48. 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 : 输入:matrix [[5,1,9,11],[2,4,…...

wsl安装Xfce桌面并设置系统语言和输入法
一、安装xfce (有相关的依赖都会安装) sudo apt -y install xfce4 二、 安装远程连接组件 sudo apt install xrdp -y 并重新启动 Xrdp 服务: sudo systemctl restart xrdp 本地windows系统中请按 winR 键 呼出运行 在运行中输入 mstsc…...