【RabbitMQ】RabbitMQ面试热点

使用RabbitMQ有什么好处?

异步处理
解耦
流量削峰

RabbitMQ 结构(如何发送消息?)

整体结构如下图所示:

在这里插入图片描述

结构介绍

Server:又称为broker,接受客户端连接,RabbitMQ 节点;
Connection:连接,应用程序与brokder建立网络连接;
channel:网络通道,几乎所有的操作都是在channel中进行的,是进行消息对象的通道,客户端可以建立 多个通道,每一个channel表示一个会话任务
Virtual Host:虚拟机,一个节点由若干个虚拟机组成;
Exchange:交换机,一个虚拟机由若干个交换机组成;
Queue:消息队列,和交换机通过routing key绑定

发送消息流程

生产者把生产的消息通过channel发送到Exchange上,Exchange通过绑定的router key来选择Queue,消费者监听到Queue上有新的消息,就消费调此消息;

如何保证消息不丢失?(可靠性)

首先搞清楚消息丢失会在哪些场景?其实在发送消息的每一个场景都会发生消息丢失情况:

  1. 生产者发送消息时,有可能没发送到MQ;
  2. 消息到达MQ了,但是MQ宕机,消息丢失;
  3. 消费者消费消息时,消费者宕机;

那么对应解决办法如下:

  1. 生产者发送消息确认机制,确认消息发送到MQ
  2. MQ开启持久化,确保消息未消费前在队列中不丢失(交换机持久化、队列持久化、消息持久化)
  3. 消费者确认机制
  4. 开启消费者失败重试机制,多次重试失败投递异常交换机

如何解决消息重复消费问题?(消息幂等性)

给每条消息设置一个唯一的标识id

其他解决方案

利用数据库唯一约束:消费数据写入数据库,可以先根据主键查询数据是否已经存在,如果已经存在了就没必要插入了。或者直接插入也没问题,因为可以利用主键的唯一性来保证数据不会重复插入,重复插入只会报错,但不会出现脏数据
还有其他解决方案,后续遇到会进行补充~~~

介绍 MQ 中延时队列?(死信交换机)

利用TTL结合死信交换机,我们实现了消息发出后,消费者延迟收到消息的效果。这种消息模式就称为延迟队列(Delay Queue)模式

延迟队列 = 死信交换机 + TTL(生存时间)

使用场景:
● 延迟发送短信
● 用户下单,如果用户在15 分钟内未支付,则自动取消
● 预约工作会议,20分钟后自动通知所有参会人员
● 定时发布抖音作品

死信交换机

满足下面条件之一就被称为死信:

  1. 消费者拒绝消费
  2. 超时未消费
  3. 消息堆积满了,最早的消息成为死信

图解:

在这里插入图片描述

代码实现:

在这里插入图片描述

TTL

在这里插入图片描述

看如下代码,就是消息设置了过期时间:

在这里插入图片描述

延迟队列插件

需要保证 RabbitMQ 已经安装了插件,这里不展开叙述。具体可以谷歌一下

在这里插入图片描述

如何解决消息堆积问题?

消息堆积发生原因是什么?是因为生产者发送消息过快,而消费者不能及时消费,导致消息堆积。那么解决办法如下:

  1. 增加消费者进行消费
  2. 消费者方可以添加线程池加快消息处理速度
  3. 使用惰性队列,可以在MQ中保存更多消息

惰性队列特征:

  1. 接收到消息后直接存入磁盘而不是内存
  2. 消费者消费消息时才会从磁盘中读取并加载到内存
  3. 支持数百万条的消息存储

惰性队列优点:

  1. 基于磁盘存储,消息上限高
  2. 没有间歇性page-out,性能稳定

惰性队列缺点:

  1. 由于存储在磁盘,消息时效性会降低
  2. 性能受限于磁盘的IO

惰性队列使用:
在这里插入图片描述

RabbitMQ 高可用机制?(集群模式)

普通集群(不采用)
镜像集群
仲裁队列

在这里插入图片描述

参考链接

https://blog.csdn.net/zw791029369/article/details/109561457
https://www.bilibili.com/video/BV1yT411H7YK?p=58

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华南理工大学数字信号处理实验实验二源码(薛y老师)

一、实验目的 ▪ 综合运用数字信号处理的理论知识进行信号分析并利用MATLAB作为编程工具进行计算机实现,从而加 深对所学知识的理解,建立概念。 ▪ 掌握数字信号处理的基本概念、基本理论和基本方法。 ▪ 学会用MATLAB对信号进行分析和处理。 ▪ 用F…

postman测试文件上传接口设置说明

Postman介绍及下载链接地址 Download Postman | Get Started for Free 打开postman 选择POST方法,然后设置goform 设置Header参数 设置Body参数,选择数据form-data 添加文件, 选择为文件属性 添加需要上传的文件

利用STM32CubeMX和keil模拟器,3天入门FreeRTOS(1.1) —— 创建多个静态任务实操和简单讲解

前言 (1)FreeRTOS是我一天过完的,由此回忆并且记录一下。个人认为,如果只是入门,利用STM32CubeMX是一个非常好的选择。学习完本系列课程之后,再去学习网上的一些其他课程也许会简单很多。 (2&am…

Ranger概述及安装配置

一、前序 希望拥有一个框架,可以管理大多数框架的授权,包括: hdfs的目录读写权限各种大数据框架中的标的权限,列级(字段)权限,甚至行级权限,函数权限(UDF)等相关资源的权限是否能帮忙做书库脱敏Ranger框架应运而生。 二、Ranger 2.1、什么是ranger Apache Ranger…

re:从0开始的HTML学习之路 11. 音视频标签

1. 音视频标签 向页面中引入音频/视频。二者使用方式一样 2. 二者常用属性 controls:是否允许用户控制播放,不加则不允许 autoplay:控制是否自动播放 loop:控制是否循环播放 注意: HTML5中若属性名与属性值相同&…

mini-Spring-BeanDefinition和BeanDefinitionRegistry(二)

Bean工厂 首先我们需要定义 BeanFactory 这样一个 Bean 工厂,提供 Bean 的获取方法 getBean(String name),之后这个 Bean 工厂接口由抽象类 AbstractBeanFactory 实现,可以统一模板。继承抽象类 AbstractBeanFactory 后的 AbstractAutowireCa…

Kotlin协程的JVM实现源码分析(下)

协程 根据 是否保存切换 调用栈 ,分为: 有栈协程(stackful coroutine)无栈协程(stackless coroutine) 在代码上的区别是:是否可在普通函数里调用,并暂停其执行。 Kotlin协程&…

66K star!想画出高颜值的流程图,试试这个手绘风开源白板

工作中总是少不了要画画图,不管是开发中绘制流程图,还是设计系统时画出架构图,一款趁手的工具总是少不了。今天我们就来聊聊画图的白板工具。 今天我们推荐的推荐的项目帮你画出手绘风的高颜值图表,目前在GitHub已超过66K Star&a…

redis优化系列(六)

本期分享redis内存过期策略:过期key的处理 Redis之所以性能强,最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能。 可以通过修改配置文件来设置Redis的最大内存: maxmemory 1gb …

DophineScheduler通俗版

1.DophineScheduler的架构 ZooKeeper: AlertServer: UI: ApiServer: 一个租户下可以有多个用户;一个用户可以有多个项目一个项目可以有多个工作流定义,每个工作流定义只属于一个项目;一个租户可…

时空预测网络ST-Resnet 代码复现

ST-ResNet(Spatio-Temporal Residual Network)是一种用于处理时空数据的深度学习模型,特别适用于视频、时间序列等具有时空结构的数据。下面是一个简单的使用PyTorch搭建ST-ResNet的示例代码。请注意,这只是一个基本的示例&#x…

大模型微调实战笔记

大模型三要素 1.算法:模型结构,训练方法 2.数据:数据和模型效果之间的关系,token分词方法 3.算力:英伟达GPU,模型量化 基于大模型对话的系统架构 基于Lora的模型训练最好用,成本低好上手 提…