当前位置: 首页 > news >正文

关于RabbitMQ常见的十道面试题

RabbitMQ是如何组成的?它有哪些重要的组件?

RabbitMQ主要由以下几个重要组件组成:

  1. Broker:这是消息代理,主要负责接收、存储和转发消息
  2. Exchanges:交换器,它的主要作用是根据一定的规则匹配消息和队列
  3. Queues:队列,这是存储消息的地方
  4. Bindings:绑定,它是连接交换器和队列的规则
  5. Producers:生产者,它的主要作用是发送消息到交换器

这些组件共同工作,使得RabbitMQ能够提供强大的消息队列功能

RabbitMQ如何保证消息的可靠性的?

RabbitMQ通过以下几种方式来保证消息的可靠性:

  1. 开启事务或者开启confirm模式:这两种方式都可以保证消息不丢失。事务模式会在消息发送过程中加锁,确保消息的可靠性,但是性能较低。而confirm模式则是在消息发送后,Broker会给生产者一个确认应答,告知消息已经正确到达,这种方式性能较高

  2. 开启RabbitMQ持久化:RabbitMQ提供了持久化功能,包括交换机、队列、消息的持久化。这样即使RabbitMQ服务重启,消息也不会丢失

  3. 关闭RabbitMQ自动ack,改成手动确认:这样可以防止消费者在处理消息过程中出现异常导致消息丢失的情况。当消费者收到消息并处理完成后,会给Broker发送一个ack应答,Broker收到应答后才会删除这条消息。如果Broker没有收到应答,那么这条消息会被重新投递给其他消费者

RabbitMQ能保证消息的顺序性吗?怎么保证消息的顺序性?

RabbitMQ可以保证消息的顺序性,主要通过以下方式实现:

  1. 创建多个队列:每个消费者固定消费一个队列的消息,这样就可以保证每个消费者处理的消息是有序的

  2. 生产者发送消息时,同一个订单号的消息发送到同一个队列中:由于同一个队列的消息是一定会保证有序的,那么同一个订单号的消息就只会被一个消费者顺序消费

这样,RabbitMQ就可以保证消息的顺序性了。但需要注意的是,这种方式需要在生产者端进行一定的控制,以确保同一个订单号的消息被发送到同一个队列中。同时,消费者端也需要进行相应的处理,以确保消息的顺序消费

RabbitMQ如何保证幂等性?

RabbitMQ可以通过以下方式来保证幂等性:

  1. 每个消息用一个唯一标识来区分:消费前先判断标识有没有被消费过,若已消费则不再消费

  2. 利用数据库的乐观锁机制:执行更新操作前先去数据库查询version,然后执行更新语句,以version作为条件

  3. 使用Redis的命令:Redis中的set命令天然支持幂等,消息消费时,只需要用set命令来判断消息是否被消费过即可

  4. 全局唯一ID + Redis:生产者在发送消息时,为每条消息设置一个全局唯一的messageId,消费者拿到消息后,使用setnx命令,将messageId作为key放到redis中:setnx (messageId,1),若返回1,说明之前没有消费过,正常消费;若返回0,说明这条消息之前已消费过,抛弃

以上就是RabbitMQ保证幂等性的主要方式。但需要注意的是,这种方式需要在生产者端进行一定的控制,以确保同一个订单号的消息被发送到同一个队列中。同时,消费者端也需要进行相应的处理,以确保消息的顺序消费

说一下RabbitMQ中的死信队列?如何实现死信队列

死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer将消息投递到broker或者直接到queue里了,consumer从queue取出消息进行消费,但某些时候由于特定的原因导致queue中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信,自然就有了死信队列

消息变成死信有以下几种情况:

  1. 消息被拒绝(basic.reject / basic.nack),并且requeue = false
  2. 消息TTL过期
  3. 队列达到最大长度

死信的处理方式

死信的产生既然不可避免,那么就需要从实际的业务角度和场景出发,对这些死信进行后续的处理,常见的处理方式大致有下面几种:

  1. 丢弃,如果不是很重要,可以选择丢弃
  2. 记录死信入库,然后做后续的业务分析或处理
  3. 通过死信队列,由负责监听死信的应用程序进行处理

综合来看,更常用的做法是第三种,即通过死信队列,将产生的死信通过程序的配置路由到指定的死信队列,然后应用监听死信队列,对接收到的死信做后续的处理。

什么是延迟队列?它的使用场景有哪些?

延迟队列是一种特殊的消息队列,进入该队列的消息会被延迟消费。也就是说,消息一旦入队了之后并不会立即被消费者消费,而是需要等待一段时间后才能被消费。延迟队列的使用场景非常广泛,以下是一些常见的例子

  1. 延迟消费:例如,用户生成订单之后,需要过一段时间校验订单的支付状态,如果订单仍未支付则需要及时地关闭订单
  2. 用户活跃度检查:例如,用户注册成功之后,需要过一段时间比如一周后校验用户的使用情况,如果发现用户活跃度较低,则发送邮件或者短信来提醒用户使用
  3. 延迟重试:例如,消费者从队列里消费消息时失败了,但是想要延迟一段时间后自动重试

以上就是延迟队列的基本概念以及一些常见的使用场景。在实际开发过程中,根据具体的业务需求,延迟队列可以有更多的应用场景

RabbitMQ如何实现延迟队列?

RabbitMQ实现延迟队列主要有两种方式:

  1. 利用RabbitMQ的TTL(Time To Live)特性和死信队列:消息在TTL设置的时间内没有被消费,则会成为“死信”并进入死信队列。具体步骤如下:

    • 声明一个普通队列,比如叫queue_normal
    • 声明一个死信队列,比如叫queue_dead
    • queue_normal设置参数x-dead-letter-exchangex-dead-letter-routing-key,值分别为queue_dead的交换器和路由键
    • queue_normal中的消息变为“死信”时,这些消息会被自动路由到queue_dead
  2. 使用RabbitMQ的插件 rabbitmq_delayed_message_exchange:这是一个官方提供的插件,可以直接用来实现延迟队列。具体步骤如下:

    • 下载并安装rabbitmq_delayed_message_exchange插件
    • 在消息发送时,设置消息的x-delay属性,该属性表示消息延迟的时间
    • 消息会在x-delay设置的时间后被投递到消费者

以上就是RabbitMQ实现延迟队列的主要方式。需要注意的是,这两种方式都需要在生产者端进行一定的控制,以确保消息的延迟投递。同时,消费者端也需要进行相应的处理,以确保消息的顺序消费

RabbitMQ怎么保证高可用的?

RabbitMQ保证高可用主要通过以下几种方式:

  1. 集群部署:RabbitMQ可以通过搭建集群来提高其高可用性。集群中的每个节点都可以处理消息,如果某个节点出现故障,其他节点仍然可以继续处理消息

  2. 镜像队列:RabbitMQ提供了镜像队列的功能,可以将队列的数据同步到多个节点,这样即使某个节点出现故障,其他节点上的镜像队列仍然可以提供服务

  3. 持久化:RabbitMQ提供了持久化机制,可以将交换器、队列、消息进行持久化,这样即使RabbitMQ服务重启,消息也不会丢失

  4. 消息确认机制:RabbitMQ提供了消息确认机制,包括生产者的confirm机制和消费者的ack机制,可以确保消息在网络环境不稳定的情况下也能正确地被发送和接收

  5. 同城双活部署架构:RabbitMQ集群采用同城双活部署架构,依靠MQ-SDK和MQ-NameServer提供的集群寻址、故障快速切换等能力保障集群的可用性

以上就是RabbitMQ保证高可用的主要方式。需要注意的是,这些方式需要在RabbitMQ的配置和使用中进行适当的设置和操作

Kafka为什么运行这么快?

Kafka的高速运行主要归功于以下几种优化方式:

  1. 顺序写入:Kafka中每个分区是一个有序的,不可变的消息序列,新的消息不断追加到partition的末尾,这就是顺序写。顺序写入可以提高磁盘I/O的性能,因为磁盘最喜欢顺序I/O

  2. 零拷贝技术:Kafka在读取的时候使用了零拷贝技术,降低对文件的拷贝次数,一定程度上提升了速度

  3. 大量使用页缓存:Kafka充分利用了操作系统的页缓存来提高I/O效率。页缓存是操作系统对数据文件的读写提供的一种缓冲技术,目的是为了减少I/O操作的次数

  4. 利用Partition实现并行处理:每个Topic都包含一个或多个Partition,不同Partition可位于不同节点,因此可以充分利用集群优势,实现机器间的并行处理

以上就是Kafka能够快速运行的主要原因。需要注意的是,这些优化方式需要在Kafka的配置和使用中进行适当的设置和操作

说一下Kafka的选举流程?

Kafka的选举流程主要是以下几步:

  1. 创建Leader父节点:在Zookeeper中创建一个名为/kafka的持久节点

  2. 各客户端竞争Leader:各客户端在/kafka下创建Leader节点,如/kafka/leader,这个节点被设置为ephemeral_sequential类型,表示这是一个临时的顺序节点

  3. 获取所有子节点并比较:客户端通过getChildren方法获取/kakfa/下所有子节点,然后比较其注册的节点的id和所有子节点中的id,如果其id在所有子节点中最小,则当前客户端竞选Leader成功

  4. 处理Leader故障:如果Leader由于某些原因(如网络故障或者异常退出)与Zookeeper断开连接,那么其他broker通过watch收到控制器变更的通知,就会去尝试创建临时节点/controller,如果有一个Broker创建成功,那么其他broker就会收到创建异常通知,也就意味着集群中已经有了控制器,其他Broker只需创建watch对象即可

  5. 防止控制器脑裂:为了解决Controller脑裂问题,ZooKeeper中还有一个与Controller有关的持久节点/controller_epoch,存放的是一个整形值的epoch number(纪元编号,也称为隔离令牌),集群中每选举一次控制器,就会通过Zookeeper创建一个数值更大的epoch number,如果有broker收到比这个epoch数值小的数据,就会忽略消息

相关文章:

关于RabbitMQ常见的十道面试题

RabbitMQ是如何组成的?它有哪些重要的组件? RabbitMQ主要由以下几个重要组件组成: Broker:这是消息代理,主要负责接收、存储和转发消息Exchanges:交换器,它的主要作用是根据一定的规则匹配消息…...

spring cloud stream

背景 主要解决不同消息中间件切换问题。实现不同中间件的代码解耦。 链接: 支持的中间件 后文使用kafka测试。 引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-stream</artifactId></depende…...

vue3 之 组合式API—watch函数

watch函数 作用&#xff1a;侦听一个或者多个数据的变化&#xff0c;数据变化时执行回调函数 两个额外参数&#xff1a; 1.immediate&#xff08;立即执行&#xff09;2.deep&#xff08;深度侦听&#xff09; 场景&#xff1a;比如选择不同的内容请求后端不同数据时 如下图 …...

并发容器【ConcurentHashMap、CopyOnWriteArrayList、阻塞队列、ArrayBlockingQueue】

并发容器 什么是并发容器?同步容器:并发容器: ConcurrentHashMap结构图JDK1.7结构图JDK1.8结构图 CopyOnWriteArrayList实现原理 并发队列阻塞队列ArrayBlockingQueue 转自极客时间 什么是并发容器? 在JUC包中&#xff0c;有一大部分是关于并发容器的&#xff0c;如Concurr…...

EmoLLM-心理健康大模型

宣传一下自己最近参与的开源 https://github.com/aJupyter/EmoLLM EmoLLM-心理健康大模型 EmoLLM 探索本项目的文档 查看Demo 报告Bug 提出新特性 EmoLLM 是一个能够支持 理解用户-支持用户-帮助用户 心理健康辅导链路的心理健康大模型&#xff0c;由 InternLM2 指令微…...

学成在线:采用XXL-JOB任务调度方案使用FFmpeg处理视频转码业务

分片技术方案 概述 XXL-JOB并不直接提供数据处理的功能&#xff0c;它只会给所有注册的执行器分配好分片序号&#xff0c;在向执行器下发任务调度的同时携带分片总数和当前分片序号等参数 设计作业分片方案保证多个执行器之间不会查询到重复的任务,保证任务不会重复执行 任…...

计算机毕业设计 | SpringBoot大型旅游网站 旅行后台管理系统(附源码)

1&#xff0c; 概述 1.1 项目背景 随着互联网技术的快速发展和普及&#xff0c;旅游行业逐渐转向线上&#xff0c;越来越多的游客选择在线预订旅游产品。传统的线下旅行社模式已不能满足市场需求&#xff0c;因此&#xff0c;开发一个高效、便捷的旅游网站成为行业的迫切需求…...

蓝桥杯----凑算式

这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。 比如: 68/3952/714 就是一种解法, 53/1972/486 是另一种解法. 这个算式一共有多少种解法? 注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。 代码 public class _03凑算式 {static int a[] {1,2,3…...

JCTC | 利用几何深度学习对蛋白质-配体结合pose进行等变灵活建模

Overview 该论文解决了药物开发中蛋白质-配体复合结构灵活建模的挑战。作者提出了一种名为FlexPose的新型深度学习框架&#xff0c;它可以直接对复杂结构进行建模&#xff0c;而不需要传统的采样和评分策略。 该模型结合了标量-向量双特征表示和 SE(3)等变网络设计来处理动态结…...

执行 terraform init 命令时 timeout 的解决方法

terrafrom 是一款常用来实现 IaC&#xff08;基础设施即代码&#xff09;的工具。通常的第一个命令往往是 terrafrom init。在执行此命令时&#xff0c;terrafrom 会根据已经配置好的 provdier 信息去下载安装对应云厂商的 provider。比如下面是一个腾讯云的 provider&#xff…...

Docker Arthas 实战指南

Arthas 是一款强大的 Java 诊断和调试工具,它能够在生产环境中实时诊断 Java 应用,提供强大的调试功能,帮助开发者和运维人员解决各种 Java 应用的性能问题和调试挑战。本指南将介绍如何在 Docker 环境中使用 Arthas 进行实战。 ​​官方文档​​ ​​GitHub地址​​ ​​…...

freertos 源码分析四 任务创建的简单分析

任务创建xTaskCreate 为TCB和TCB栈分配空间&#xff0c; 初始化&#xff0c;加入就绪任务链表 #if ( configSUPPORT_DYNAMIC_ALLOCATION 1 )BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,const char * const pcName,const configSTACK_DEPTH_TYPE usStackDepth,void *…...

二叉树的锯齿形遍历,力扣

目录 题目&#xff1a; 我们直接看题解吧&#xff1a; 快速理解解题思路小建议&#xff1a; 解题方法&#xff1a; 相似题目对比分析&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 补充说明&#xff1a; 思路优化&#xff1a; 代码实现(层序遍历倒序)&#xff1a; 题…...

避免Arrays.asList陷阱:优雅处理结构性修改的方法

临近年终&#xff0c;项目交付排期比较紧张&#xff0c;导致很多时候&#xff0c;Code Review 往往是走马观花&#xff0c;没有严格执行。最近&#xff0c;一个实习生就产生了一个十分低级的代码BUG。笔者感觉这个问题&#xff0c;对于实习生&#xff0c;尤其是刚入职的 应届 J…...

微信小程序(三十六)事件传参

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.传参步骤 2.传参接收解构步骤 源码&#xff1a; index.wxml <button type"primary" bind:tap"onclick" mark:index"{{0}}" mark:remb"{{1}}" class"But&quo…...

编译原理与技术(三)——语法分析(二)自顶向下-递归下降

一、语法分析的两种方法 自顶向下&#xff08;Top-down&#xff09;&#xff1a; 针对输入串&#xff0c;从文法的开始符号出发&#xff0c;尝试根据产生式规则推导&#xff08;derive&#xff09;出该输入串。 从根部开始构造语法树。 自底向上&#xff08;Bottom-up&#…...

okhttp 的 拦截器

拦截器有很多作用&#xff0c;实现就是责任链模式&#xff0c;细节&#xff0c;等我有时间补上。 后面有时间更新一下。 OkHttp最核心的工作是在 getResponseWithInterceptorChain() 中进行&#xff0c;在进入这个方法分析之前&#xff0c;我们先来了 解什么是责任链模式&…...

Android:多线程下载网络图片

3.12 网络图片操作 1、通过URL请求获取网络图片 示例: 创建t_picture.xml,页面layout布局文件,一个Button按钮和一个ImageView容器显示图片。 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.a…...

跟着GPT学设计模式之原型模式

如果对象的创建成本比较大&#xff0c;而同一个类的不同对象之间差别不大&#xff08;大部分字段都相同&#xff09;&#xff0c;在这种情况下&#xff0c;我们可以利用对已有对象&#xff08;原型&#xff09;进行复制&#xff08;或者叫拷贝&#xff09;的方式来创建新对象&a…...

博客|基于Springboot的个人博客系统设计与实现(源码+数据库+文档)

个人博客系统目录 目录 基于Springboot的个人博客系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;1&#xff09;用户管理 &#xff08;2&#xff09;文章分类管理 &#xff08;3&#xff09;公告信息管理 &#xff08;4&#…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...