RabbitMQ相关问题

Mybatis框架相关问题

RabbitMQ相关问题

  • 一、RabbitMQ的核心组件和工作原理?
  • 二、如何保证消息可靠投递不丢失的?
  • 三、RabbitMQ如何保证消息的幂等性?
  • 四、什么是死信队列?死信队列是如何导致的?
  • 五、RabbitMQ死信队列是如何导致的?
  • 六、什么是延迟队列?RabbitMQ 如何实现延迟队列?
  • 七、RabbitMQ的高可用机制有了解嘛?
  • 八、如果有百万消息堆积在MQ中,如何解决?
  • 九、如何解决RabbitMQ中因为消息堆积而导致的消息过期失效的问题?

一、RabbitMQ的核心组件和工作原理?

在这里插入图片描述
交换机有四类:
1、Fanout Exchange

投递到所有绑定的队列,不需要规则,不需要匹配,相当于广播、群发;
在这里插入图片描述
2、Direct Exchange

根据路由键精确匹配进行路由消息队列;
在这里插入图片描述
3、Topic Exchange

通配符匹配,相当于模糊匹配;

# 匹配多个单词,* 匹配一个单词,用 . 隔开的为一个单词:

在这里插入图片描述
4、Headers Exchange

基于消息内容中的headers属性进行匹配;
在这里插入图片描述

二、如何保证消息可靠投递不丢失的?

在这里插入图片描述
要确保一下四个步骤全部成功;
① 代表消息从生产者发送到Exchange;
② 代表消息从Exchange路由到Queue
③ 代表消息在Queue中存储;
④ 代表消费者监听Queue并消费消息;

  • ① 代表消息从生产者发送到Exchange;

    • 方案:开启Confirm确认模式;
    • 消息未投递成功,采取补偿措施,或是记录日志,或是发送通知让负责人知道;
    // 实现接口
    implements RabbitTemplate.ConfirmCallback// 重写方法
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause)
    
  • ② 代表消息从Exchange路由到Queue;

    • 方案:开启Return返回模式;
    • 消息未投递成功,采取补偿措施,或是记录日志,或是发送通知让负责人知道;
    // 实现接口
    implements RabbitTemplate.ReturnsCallback/*** 消息从 交换机 --> 到 --> 队列,如果失败了,就会回调该方法* (失败了才触发该方法,成功是不会触发该方法的)** 比如说磁盘满** @param returned*/
    @Override
    public void returnedMessage(ReturnedMessage returned)
    
  • ③ 代表消息在Queue中存储;

    • 方案:
      1、交换机持久化
          /*** 声明创建一个FanoutExchange交换机** @return*/@Beanpublic DirectExchange directExchange() {return ExchangeBuilder.directExchange(DIRECT_EXCHANGE_NAME).durable(true) // 持久化.build();}
      
      2、队列持久化
          /*** 声明创建一个队列** @return*/@Beanpublic Queue directQueue() {return QueueBuilder.durable(DIRECT_QUEUE_NAME).build();}
      
      3、消息持久化
      	//消息体Message message = MessageBuilder.withBody(json.getBytes(StandardCharsets.UTF_8)).setDeliveryMode(MessageDeliveryMode.PERSISTENT) //消息持久化.build();
      
      4、集群高可用部署
  • ④ 代表消费者监听Queue并消费消息;

    • 方案:手动确认消息
    @Slf4j
    @Component
    public class MyRabbitListener {@RabbitListener(queues = {RabbitConfig.DIRECT_QUEUE_NAME})public void onMessage(String msg, @Headers Map<String, Object> header, Message message, Channel channel) {try {System.out.println("[RabbitListener]接收到的消息: " + msg);//处理业务//业务处理成功,手动确认消息channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);//业务处理失效,不确认消息,并且重新入队,这样又可以重新消费// channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);//拒绝消息// channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);} catch (Exception e) {e.printStackTrace();}}
    }
    

三、RabbitMQ如何保证消息的幂等性?

幂等性:多次操作,重复操作,对系统不会造成影响; 比如:消息重复发送两次或多次,消息重复消费两次或多次;

保证MQ的幂等性,只要保证消费者不会重复消费相同的消息即可;

  • 方案:
    • 生产者发送消息时,为每条消息设置一个全局唯一的id
    • 消费者消费消息时,使用 redis 的 setnx 命令:SET id 1 NX,若返回OK,说明该消息之前没有消费过,正常消费;若返回 nil,说明该消息之前已消费过,那就不用处理;

四、什么是死信队列?死信队列是如何导致的?

死信队列即DLX,全称为Dead-Letter-Exchange,翻译为:死信交换机。当一个消息在队列中变成死信 (dead message) 之后,它能被重新发送到另外一个交换机中,这个交换机就是DLX,绑定到DLX的队列就称为死信队列;

死信队列本身也是一个普通的消息队列,可以通过设置一些参数将其设置为死信队列;

死信队列是一个用于存放无法被消费的消息的队列,这些消息被称为死信,死信队列可以避免消息一直被消费却无法消费成功的情况;

在这里插入图片描述

五、RabbitMQ死信队列是如何导致的?

RabbitMQ导致死信的几种原因:
1、消息被拒

  • Basic.Nack 且 requeue = false
  • Basic.Reject 且 requeue = false

2、消息 TTL 过期;
3、队列达到最大长度,即队列满了;

在这里插入图片描述

六、什么是延迟队列?RabbitMQ 如何实现延迟队列?

  • 延迟队列是用来存放“延迟消息”的队列;
  • 所谓“延迟消息”是指消息被发送到队列以后,并不想让消费者立刻拿到消息,而是等待指定的时间后,消费者才能拿到这个消息;

RabbitMQ 本身是没有直接可以使用的延迟队列;要实现延迟队列,一般有两种方式:

  • 使用TTL消息过期 + DLX死信队列来实现;
    在这里插入图片描述

  • 使用使用 rabbitmq-delayed-message-exchange 延迟插件来实现;
    在这里插入图片描述

七、RabbitMQ的高可用机制有了解嘛?

RabbitMQ有三种模式:
1)单机模式
2)普通集群模式
在这里插入图片描述

3)镜像集群模式 (高可用)
在这里插入图片描述

八、如果有百万消息堆积在MQ中,如何解决?

在这里插入图片描述

  • 原因:生产和消费失衡;
  • 解决:

1、提前预防;

  • 流量预估,预估每秒产生的消息数量;
  • 做好压测,压测系统的消费能力;
  • 做好预案,准备好可能发生的超出预估的突发情况;

2、应急处理;

  • 消费端
    • 临时增加消费者数量:增加更多的消费者实例、增加消费者线程数量;
    • 临时增加消费者把消息写入其他设备,后续处理;
  • 生产端
    • 可以适当限流,降低消息发送速度;

3、事后优化;

  • 优化消费端业务处理逻辑,提升业务执行效率,减少io操作,减少数据库操作,减少网络连接,业务异步处理等;

九、如何解决RabbitMQ中因为消息堆积而导致的消息过期失效的问题?

消息堆积,导致消息大量存储在消息队列中得不到消费,而消息又设置了TTL过期时间,当到达过期时间时,消息被过期丢弃;

解决:
1、让消息不要被堆积;
2、不设置TTL过期时间或者增加过期时间时长;
3、设置死信队列
4、编写临时程序补发消息;

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

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

相关文章

回溯 Leetcode 332 重新安排行程

重新安排行程 Leetcode 332 学习记录自代码随想录 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&a…

【Datawhale组队学习:Sora原理与技术实战】Attention

Attention Attention 注意力&#xff0c;从两个不同的主体开始。 论文&#xff1a;https://arxiv.org/pdf/1703.03906.pdf seq2seq代码仓&#xff1a;https://github.com/google/seq2seq 计算方法&#xff1a; 加性Attention&#xff0c;如&#xff08;Bahdanau attention&…

【工商业储能如何选】Acrel工商业储能系统解决方案

市场前景 碳中和&#xff1a;全球应对气候危机重建人与自然和谐关系的共同目标 清洁替代&#xff1a;清洁能源替代化石能源是全球实现碳中和的唯一路径 能量存储&#xff1a;储能技术是解决大比例清洁能源时空分布不平衡的最佳方案 应用场景 随着“双碳”目标下的新型电力…

Python+Selenium使用Page Object实现页面自动化测试

Page Object模式是Selenium中的一种测试设计模式&#xff0c;主要是将每一个页面设计为一个Class&#xff0c;其中包含页面中需要测试的元素&#xff08;按钮&#xff0c;输入框&#xff0c;标题 等&#xff09;&#xff0c;这样在Selenium测试页面中可以通过调用页面类来获取页…

记一次:android学习笔记一(学习目录-不要看无内容)

学习目录如下 B站学习的名称--Android开发从入门到精通(项目案例版) 网址:https://www.bilibili.com/video/BV1jW411375J/ 第0章:安装 android stoid 参考地址https://blog.csdn.net/adminstate/article/details/130542368 第一章:第一个安卓应用 第二章:用户界面设…

OpenCV 4基础篇| OpenCV图像的拆分和合并

目录 1. 通道拆分1.1 cv2.split1.1.1 语法结构1.1.2 注意事项1.1.3 代码示例 1.2 NumPy切片1.2.1 代码示例 2. 通道合并2.1 cv2.merge2.1.1 语法结构2.1.2 注意事项2.1.3 代码示例 1. 通道拆分 1.1 cv2.split 1.1.1 语法结构 b,g,r cv2.split(img[, mv]) #图像拆分为 BGR 通…

【开发工具】GIF 录屏工具推荐 ( GIF123 - 推荐使用 | GifCam | LICEcap )

文章目录 一、GIF 录屏工具推荐1、GIF123 ( 推荐使用 )2、GifCam3、LICEcap 本博客中介绍的 3 款 GIF 录屏工具下载地址 : https://download.csdn.net/download/han1202012/88905642 也可以到对应的官网独立下载 : GIF123 : https://gif123.aardio.com/ ;GifCam : https://bl…

FAST-LIO系列-阅读笔记

近期&#xff0c;阅读了FAST-LIO、FAST-LIO2以及Faster_LIO论文&#xff0c;这三篇论文都属于滤波器的SLAM算法&#xff0c;下面记录一下三个工作的主要贡献和不同。 FAST-LIO 1.提出了一种计算效率高、鲁棒性强的激光雷达-惯性里程测量框架。使用紧密耦合的迭代扩展卡尔曼滤…

报错:/bin/sh: warning: setlocale: LC_ALL: cannot change locale (zh_CN.UTF-8)

解释&#xff1a;这是shell 警告你无法将当前的区域设置&#xff08;locale&#xff09;更改为 zh_CN.UTF-8&#xff0c;这个警告可能不会影响 fc-cache 命令的实际运行&#xff0c;但它确实表明系统在某些方面可能无法正确地处理与 zh_CN.UTF-8 相关的内容。 1.检查当前的区域…

2024年口腔护理市场行业未来前景预测:正畸护理用品市场行业分析报告

口腔护理是维护口腔健康的重要步骤&#xff0c;近年来&#xff0c;随着大众口腔健康意识的不断增强&#xff0c;人们对于口腔护理的消费意愿也不断增加&#xff0c;由此&#xff0c;口腔护理市场的市场规模也比较大。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;20…

OSCP靶场--Walla

OSCP靶场–Walla 考点(1.hydra http基本认证爆破&#xff1a; 2.sudo -l&#xff1a;python导入外部模块提权 3.Linux内核提权&#xff1a;cve-2021-4034) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.181.97 --min-rate 2000 Starting N…

RT-DETR算法优化改进: 特征融合涨点篇 | 广义高效层聚合网络(GELAN) | YOLOv9

💡💡💡本文独家改进:即结合用梯度路径规划(CSPNet)和(ELAN)设计了一种广义的高效层聚合网络(GELAN),高效结合RT-DETR,实现涨点。 💡💡💡在多个私有数据集和公开数据集VisDrone2019、PASCAL VOC实现涨点 RT-DETR魔术师专栏介绍: https://blog.csdn.net/…

使用postman测试若依登录接口API-2

请求方式 由于登录控制器可知&#xff1a;该请求方式为Post请求 请求地址 在请求路径栏输入请求地址&#xff0c;如下图所示&#xff1a; 参数体 在Body键入所需参数&#xff0c;类型选择raw,数据格式选择"JSON"&#xff1a;如下图所示&#xff1a; 认证成功与失败…

香杆箐骑行记,春回大地

2024年3月2日春回大地之际我们校长骑行群再次踏上征程前往香杆箐。这次骑行不仅是一次对身体的锻炼更是一次心灵的洗礼。 清晨的阳光洒满大地我们从郊野公园后门出发踏上了前往香杆箐的道路。沿途的风景如画绿树成荫鲜花盛开让人心旷神怡。我们沿着山路蜿蜒前行感受着大自然的韵…

正则表达式-分组

1、oracle-正则表达式&#xff1a;将09/29/2008 用正则表达式转换成2008-09-29 select regexp_replace(09/29/2008, ^([0-9]{2})/([0-9]{2})/([0-9]{4})$, \3-\1-\2) replace from dual; 解析&#xff1a;regexp_replace-替换&#xff0c; 第一个参数&#xff1a;需要进行处…

Golang Copy()方法学习

前言 主要是涉及到深浅拷贝相关的&#xff0c;但是在看的一个资料过程中发现他有错…并且一系列&#xff0c;复制粘贴他的&#xff0c;也都错了。 错误文章指路 很显然&#xff0c;Copy是深拷贝啊&#xff01;&#xff01;&#xff01; Copy功能 copy的代码很少&#xff0c…

玩转地下管网三维建模:MagicPipe3D系统

地下管网是保障城市运行的基础设施和“生命线”。随着实景三维中国建设的推进&#xff0c;构建地下管网三维模型与地上融合的数字孪生场景&#xff0c;对于提升智慧城市管理至关重要&#xff01;针对现有三维管线建模数据差异大、建模交互弱、模型效果差、缺乏语义信息等缺陷&a…

Bert Encoder和Transformer Encoder有什么不同

前言&#xff1a;本篇文章主要从代码实现角度研究 Bert Encoder和Transformer Encoder 有什么不同&#xff1f;应该可以帮助你&#xff1a; 深入了解Bert Encoder 的结构实现深入了解Transformer Encoder的结构实现 本篇文章不涉及对注意力机制实现的代码研究。 注&#xff1a;…

详解:npm升级到pnpm对比优化点!!

npm3之前 依赖树层级过深&#xff0c;导致依赖路径过长并且相同依赖模块会被重复安装,占用电脑磁盘空间 npm3之后 修改为扁平化处理 算法复杂存在多项目间依赖相同副本的情况导致没有明确被依赖的包也可以直接引用&#xff0c;管理复杂 pnpm node_modules改成非扁平化结构&a…

微软37页论文逆向工程Sora,得到了哪些结论?

一篇论文回顾 Sora 文生视频技术的背景、技术和应用。 追赶 Sora&#xff0c;成为了很多科技公司当下阶段的新目标。研究者们好奇的是&#xff1a;Sora 是如何被 OpenAI 发掘出来的&#xff1f;未来又有哪些演进和应用方向&#xff1f; Sora 的技术报告披露了一些技术细节&…