RabbitMQ相关问题

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
           */
          @Bean
          public DirectExchange directExchange() {
              return ExchangeBuilder.directExchange(DIRECT_EXCHANGE_NAME)
                      .durable(true) // 持久化
                      .build();
          }
      
      2、队列持久化
          /**
           * 声明创建一个队列
           *
           * @return
           */
          @Bean
          public 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、编写临时程序补发消息;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PDF 解析问题调研

说点真实的感受 &#xff1a;网上看啥组件都好&#xff0c;实际测&#xff0c;啥组件都不行。效果好的不开源收费&#xff0c;开源的效果不好。测试下来&#xff0c;发现把组件融合起来&#xff0c;还是能不花钱解决问题的&#xff0c;都是麻烦折腾一些。 这里分享了目前网上能…

数据结构 第3章 栈、队列和数组(一轮习题总结)

第3章 栈、队列和数组 3.1 栈3.2 队列3.3 栈与队列的应用3.4 数组和特殊矩阵 3.1 栈&#xff08;1 10 11 20&#xff09; 3.2 队列&#xff08;6 12 14 17&#xff09; 3.3 栈与队列的应用&#xff08;6 11&#xff09; 3.4 数组和特殊矩阵 3.1 栈 T1 栈和队列具有相同的逻辑…

一周学会Django5 Python Web开发-Django5详细视图DetailView

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计28条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

Linux-信号2

文章目录 前言一、信号是如何保存的&#xff1f;int sigemptyset(sigset_t *set);int sigfillset(sigset_t *set);int sigaddset (sigset_t *set, int signo);int sigdelset(sigset_t *set, int signo);int sigismember&#xff08;const sigset_t *set, int signo);int sigpen…

leetcode 长度最小的子数组

在本题中&#xff0c;我们可以知道&#xff0c;是要求数组中组成和为target的最小子数组的长度。所以&#xff0c;我们肯定可以想到用两层for循环进行遍历&#xff0c;然后枚举所有的结果进行挑选&#xff0c;但这样时间复杂度过高。 我们可以采用滑动窗口&#xff0c;其实就是…

NoSQL--1.虚拟机网络配置

目录 1.初识NoSQL 1.1 NoSQL之虚拟机网络配置 1.1.1 首先&#xff0c;导入预先配置好的NoSQL版本到VMware Workstation中 1.1.2 开启虚拟机操作&#xff1a; 1.1.2.1 点击开启虚拟机&#xff1a; 1.1.2.2 默认选择回车CentOS Linux&#xff08;3.10.0-1127.e17.x86_64) 7 …

同样是证书,NPDP和PMP有什么区别?

PMP和NPDP的区别是啥&#xff1f; PMP、NPDP证书考哪个更有用&#xff1f;还是两个都考&#xff1f; PMP和NPDP哪个更适合现在及以后发展&#xff1f; PMP和NPDP这两哪个含金量更高&#xff1f; 一&#xff0c;关于PMP和NPDP PMP和NPDP都是美国PMI/PDMA的专业考试&#xf…

C语言中的分支和循环语句:从入门到精通

分支和循环语句 1. 前言2. 预备知识2.1 getchar函数2.2 putchar函数2.3 计算数组的元素个数2.4 清屏2.5 程序的暂停2.6 字符串的比较 3. 结构化3.1 顺序结构3.2 分支结构3.3 循环结构 4. 真假性5. 分支语句&#xff08;选择结构&#xff09;5.1 if语句5.1.1 语法形式5.1.2 else…

Stable Cascade又升级了,现在只需要两个模型

Stable Cascade这个模型&#xff0c;大家如果还有印象的话&#xff0c;是需要下载三个模型的&#xff0c;分别是Stage_a,Stage_b和Stage_c,如果全都下载下来&#xff0c;需要20多个G&#xff0c;但是最近使用ComfyUI做尝试的时候&#xff0c;发现官方的案例中已经没有用到单独的…

数据审计 -本福德定律 Benford‘s law (sample database classicmodels _No.6)

数据审计 -本福德定律 Benford’s law 准备工作&#xff0c;可以去下载 classicmodels 数据库资源如下 [ 点击&#xff1a;classicmodels] 也可以去我的博客资源下载 文章目录 数据审计 -本福德定律 Benfords law 前言一、什么是 本福德定律&#xff1f;二、数学公式三、应用…

单细胞Seurat - 降维与细胞标记(4)

本系列持续更新Seurat单细胞分析教程&#xff0c;欢迎关注&#xff01; 非线形降维 Seurat 提供了几种非线性降维技术&#xff0c;例如 tSNE 和 UMAP&#xff0c;来可视化和探索这些数据集。这些算法的目标是学习数据集中的底层结构&#xff0c;以便将相似的细胞放在低维空间中…

Grpc项目集成到java方式调用实践

背景&#xff1a;由于项目要对接到grcp 的框架&#xff0c;然后需要对接老外的东西&#xff0c;还有签名和证书刚开始没有接触其实有点懵逼。 gRPC 是由 Google 开发的高性能、开源的远程过程调用&#xff08;RPC&#xff09;框架。它建立在 HTTP/2 协议之上&#xff0c;使用 …

从零开始手写RPC框架(3)——ZooKeeper入门

目录 ZooKeeper简介ZooKeeper中的一些概念 ZooKeeper安装与常用命令常用命令 ZooKeeper Java客户端 Curator入门 ZooKeeper简介 是什么&#xff1f; ZooKeeper 是一个开源的分布式协调服务&#xff0c;本身就是一个分布式程序&#xff08;只要半数以上节点存活&#xff0c;Zo…

django-admin登录窗口添加验证码功能-(替换原有的login.html)captcha插件

需求&#xff1a; 1&#xff1a;更改django框架的admin登录窗口标题 2&#xff1a;在admin登录窗口中添加验证码功能 3&#xff1a;验证码允许点击更换 步骤如下&#xff1a; 1:安装插件以及在安装列表中添加插件 2:自定义表单forms.py 3:创建login.html文件(复制django内置的l…

中国电子学会2020年6月份青少年软件编程Sc ratch图形化等级考试试卷四级真题。

第 1 题 【 单选题 】 1.执行下面程序&#xff0c;输入4和7后&#xff0c;角色说出的内容是&#xff1f; A&#xff1a;4&#xff0c;7 B&#xff1a;7&#xff0c;7 C&#xff1a;7&#xff0c;4 D&#xff1a;4&#xff0c;4 2.执行下面程序&#xff0c;输出是&#xff…

备战蓝桥杯Day22 - 计数排序

计数排序问题描述 对列表进行排序&#xff0c;已知列表中的数范围都在0-100之间。设计时间复杂度为O(n)的算法。 比如列表中有一串数字&#xff0c;2 5 3 1 6 3 2 1 &#xff0c;需要将他们按照从小到大的次序排列&#xff0c;得到1 1 2 2 3 3 5 6 的结果。那么此时计数排序是…

每天一道leetcode:14.最长公共前缀(简单)

⭐今日份题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例1 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl" 示例2 输入&#…

制作镜像与配置推送阿里云仓库

一、制作jdk镜像 1.1、Alpine linux简介 Alpine Linux是一个轻量级的Linux发行版&#xff0c;专注于安全、简洁和高效。它采用了musl libc和BusyBox&#xff0c;使得系统资源占用较少&#xff0c;启动速度较快。 Alpine Linux也提供了一个简单的包管理工具APK&#xff0c;(注…

MySQL:索引的优化方法

索引是帮助存储引擎快速获取数据的一种数据结构&#xff0c;形象的说就是索引是数据的目录。 索引创建的时机&#xff1a; 索引并不是越多越好的&#xff0c;虽然他再查询时会提高效率&#xff0c;但是保存索引和维护索引也需要一定的空间和时间成本的。 不创建索引&#xff1a…