RabbitMQ系列之死信交换机的使用

这篇具有很好参考价值的文章主要介绍了RabbitMQ系列之死信交换机的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

 🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的博客专栏《RabbitMQ系列之死信交换机的使用》。🎯🎯

🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端 

前言

        在我们上一期的RabbitMQ博客系列的分享中我们分享了有关RabbitMQ中交换机的使用,其中讲解到什么是交换机,以及交换机的类型。主要讲述了直连交换机、主题交换机、扇形交换机的示例使用,还有一个死信交换机的示例使用没有讲到,本期博客就针对与死信交互机详细的讲解一下。

一、死信交换机的简介

1. 简单概述

        死信交换机(Dead-Letter-Exchange,简称DLX)是 RabbitMQ 的一种消息机制用于处理那些无法被正常消费的消息。当消息在一个队列中满足某些条件(如过期、被拒绝等)时,这些消息会被放入死信队列中。如果队列配置了死信交换机属性,这些死信消息会被投递到指定的交换机中,这个交换机就被称为死信交换机。

        死信交换机的使用可以帮助避免消息的丢失,并提供了重试和诊断问题的机制。当消息成为死信后,可以将其重新投递到另一个队列中,以便再次尝试消费。此外,死信交换机还可以用于实现延时队列的功能。

        当我们发送一个消息到我们的RabbitMQ中,我们的一个消息被消费者拒绝后,可以通过设置requeue参数为false,使其消息成为死信消息并被投递到死信交换机中。死信交换机可以与普通交换机一样绑定队列,将死信路由与他绑定的队列中。通过这种的方式可以实现对问题的诊断和重试消费。

2.  优缺点

        死信交换机是一种网络设备,它可以在数据包从一个端口发送到另一个端口时确保数据包的安全性和可靠性。它通常用于安全传输敏感信息,如公司内部的机密文件或政府机构的敏感信息。以下是死信交换机的一些优缺点:

死信交互机的优点
优点 说明
数据包安全性和可靠性 由于数据包不会直接从一个端口发送到另一个端口,攻击者无法窃取数据包并篡改其内容。这确保了数据包的安全性和可靠性。
数据包完整性验证 当数据包到达死信邮箱时,接收方可以确认接收到的数据包的完整性并进行相关操作。这有助于防止数据包在传输过程中被篡改或损坏。
防止拒绝服务攻击 死信交换机可以用于防止拒绝服务攻击。在这些攻击中,攻击者会向目标服务器发送大量垃圾流量,以使其崩溃或过载。使用死信交换机可以避免这种情况的发生,因为攻击者无法直接攻击目标服务器,而只能攻击死信交换机上的邮箱地址。
死信交换机的缺点
缺点 说明
对服务器和数据库性能要求高(要求高) 由于死信交换机需要处理大量数据包和请求,因此对服务器和数据库的性能要求较高。如果服务器或数据库性能不足,可能会导致数据包处理延迟或丢失。
处理大量订单力不从心(效率低) 对于需要处理大量订单的应用程序,死信交换机可能无法满足实时性的要求。由于数据包需要经过多个中间节点,可能会导致处理时间延迟。
配置和维护复杂(成本高) 死信交换机需要正确配置和持续维护,以确保其正常工作并保持最佳性能。这可能需要较高的技术水平和资源投入。

         总之,死信交换机在确保数据包的安全性和可靠性方面非常有用,但在使用过程中需要注意其性能和配置要求。在选择使用死信交换机时,需要根据实际需求和资源状况进行权衡和考虑。

3. 实现的流程

当队列中的消息满足以下情况之一时,可以成为死信:

  1. 消费者使用basic.reject或basic.nack声明消费失败,并且消息的requeue参数设置成了false。
  2. 消息是一个过期消息,超时无人消费。
  3. 要投递的队列消息满了,最新进来的消息变成死信。

 图解说明

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

模拟业务图解说明

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

 视频讲解

        不懂的小伙伴可以观看视频学习了解。

阿里一面——说说RabbitMQ死信队列、延时队列

二、死信交换机实战

1. 创建队列

        我们基于上一期博客代码进行实战演示,我们重新创建两个队列用于模拟实现我们的功能,

//    创建两个队列
    @Bean
//                声明第一个队列  。
    public Queue queueA(){
        return new Queue("queueA");
    }
    @Bean
//        声明第二个队列
    public Queue queueB(){
        return new Queue("queueB");
    }

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

2. 创建交换机 

         对应上述的图解我们创建两个交换机,一个是普通交换机,一个是死信交换机。

//   创建两个交换机  一个是死信交换机  一个是普通交换机
    @Bean
    public DirectExchange exchangeA(){ 
    return new DirectExchange("Exchange-A");
    }

    @Bean
    public DirectExchange exchangeB (){
        return new DirectExchange("Exchange-B");
    }

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

3. 绑定交换机和队列关系

  @Bean
    public Binding bindingA(){
    return BindingBuilder
            .bind(queueA())
            .to(exchangeA())
            .with("A");
            }
    @Bean
    public Binding bindingB(){
        return BindingBuilder
                .bind(queueB())
                .to(exchangeB())
                .with("B");
    }

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

4. 配置死信队列

生产者

         我们现在两个交换机之间没有任何关系,因此我们对其进行操作使其关联起来。我们对queueA()方法进行修改。

@Bean
//                声明第一个队列  。
    public Queue queueA(){
        Map<String, Object> config = new HashMap<>();
        //message在该队列queue的存活时间最大为10秒
        config.put("x-message-ttl", 10000);
        //x-dead-letter-exchange参数是设置该队列的死信交换器(DLX)
        config.put("x-dead-letter-exchange", "ExchangeB");
        //x-dead-letter-routing-key参数是给这个DLX指定路由键
        config.put("x-dead-letter-routing-key", "BB");
        return new Queue("queueA",true,false,false,config);
    }

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

         在我们的控制台中编写对应的请求方法发送信息到我们的A队列中

    @RequestMapping("/send7")
    public String send7() {
//    向交换机发送消息
    amqpTemplate.convertAndSend("ExchangeA","AA","25965616516646465");
    return "木易Love馨月";
}

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

 消费者

        我们在对应的消费者这边创建一个接受类,专门接受QueueB的消息。

 ReceiverQB.java
package com.yx.consumer;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queueB") //接收的队列
public class ReceiverQB {
@RabbitHandler
public void process(String id) {
log.warn("QB接收到:" + id);
}
}

测试

        我们还是先启动我们的生产者服务,并且在我们的网页上去访问我们编写的send7请求方法。在访问前我们的队列并没有生成。

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

         当我们重新发送三次请求给我们的A队列,如下图所示

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

        我们等待我们的队列A的过期时间重新刷新页面,刷新后的页面显示如下 

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

 ·        消息从队列A跳转到队列B的原因是我们没有写队列A的消费者,使其消息在队列A中等待过期时间已过就会将消息提交到我们的队列B中,我们队列B进行接收队列A过期的消息。接下来我们运行启动我们的消费者服务。

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

三、设置手动确认消息

        我们将下述配置添加到我们消费者的配置文件中去

 listener:
      simple:
        acknowledge-mode: manual

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

         我们在消费者中编写一个消息接收类用于接收队列A中的消息。

 ReceiverQA.java

package com.yx.consumer;

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queueA") //接收的队列
public class ReceiverQA {
@RabbitHandler
public void process(String id, Channel channel,@Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {
log.warn("QA接收到:" + id);
channel.basicAck(tag, true);//确认消息成功消费
}
}

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

        我们重启我们的消费者服务进行网页测试接口方法

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

         我们现在将队列A的改为拒接消息让消息重新入列,并且设置延迟时间1000ms。true:接收;fasle:拒绝

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

        我们重新访问请求方法,进行测试 

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

        我们再将true改为false重新启动服务测试。

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

        接下来我们前往官网页面进行查看是发现我们的消息全部在我们的QB中,并且是未被处理的。 

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

        消息存在的原因因为我们死信队列的消费者中并没有进行对消息的确认。只要我们仿照QA进行编写确认即可。

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端

        我们再去官网查看一下就会发现我们的消息都处理了。 

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端


🎉🎉本期的博客分享到此结束🎉🎉

📚📚各位老铁慢慢消化📚📚

🎯🎯下期博客博主会带来新货🎯🎯

🎁三连加关注,阅读不迷路 !🎁

RabbitMQ系列之死信交换机的使用,MQ,rabbitmq,分布式,后端文章来源地址https://www.toymoban.com/news/detail-826885.html

到了这里,关于RabbitMQ系列之死信交换机的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 消息队列中间件,RabbitMQ的使用,死信队列,延迟队列,利用枚举实现队列,交换机,RountKey的声明

    目录 0.交换机种类和区别 1.声明队列和交换机以及RountKey 2.初始化循环绑定 3.声明交换机 4.监听队列 4.1 监听普通队列 4.2监听死信队列  5.削峰填谷的实现 Direct Exchange(直连交换机) : 直连交换机将消息发送到与消息的路由键完全匹配的队列。它是最简单的交换机类型之一。

    2024年04月23日
    浏览(49)
  • 【RabbitMQ】 RabbitMQ 消息的延迟 —— 深入探索 RabbitMQ 的死信交换机,消息的 TTL 以及延迟队列

    消息队列是现代分布式应用中的关键组件,用于实现异步通信、解耦系统组件以及处理高并发请求。消息队列可以用于各种应用场景,包括任务调度、事件通知、日志处理等。在消息队列的应用中,有时需要实现消息的延迟处理、处理未能成功消费的消息等功能。 本文将介绍

    2024年02月05日
    浏览(47)
  • RabbitMQ学习笔记(消息发布确认,死信队列,集群,交换机,持久化,生产者、消费者)

    MQ(message queue):本质上是个队列,遵循FIFO原则,队列中存放的是message,是一种跨进程的通信机制,用于上下游传递消息。MQ提供“逻辑解耦+物理解耦”的消息通信服务。使用了MQ之后消息发送上游只需要依赖MQ,不需要依赖其它服务。 功能1:流量消峰 功能2:应用解耦 功

    2024年02月07日
    浏览(31)
  • RabbitMQ:概念和安装,简单模式,工作,发布确认,交换机,死信队列,延迟队列,发布确认高级,其它知识,集群

    1.1.1.什么是MQ MQ(message queue:消息队列) ,从字面意思上看,本质是个 队列 , FIFO 先入先出 ,只不过队列中存放的 内容是message 而已 ,还是一种 跨进程的通信机制 , 用于上下游传递消息 。在互联网架构中,MQ 是一种非常常见的上下游 “逻辑解耦+物理解耦” 的消息通信服

    2024年01月20日
    浏览(40)
  • RabbitMQ系列(27)--RabbitMQ使用Federation Exchange(联邦交换机)解决异地访问延迟问题

    前言: (broker北京)、(broker深圳)彼此之间相距甚远,网络延迟是一个不得不面对的问题。有一个在北京的业务(Client北京)需要连接(broker北京),向其中的交换器exchangeA发送消息,此时的网络延迟很小,(Client北京)可以迅速将消息发送至exchangeA 中,就算在开启了publisherconfirm机制或

    2024年02月13日
    浏览(47)
  • RabbitMQ系列(14)--Topics交换机的简介与实现

    1、Topics交换机的介绍 Topics交换机能让消息只发送往绑定了指定routingkey的队列中去,不同于Direct交换机的是,Topics能把一个消息往多个不同的队列发送;Topics交换机的routingkey不能随意写,必须是一个单词列表,并以点号分隔开,例如“one.two.three”,除此外还有两个替换符,

    2024年02月13日
    浏览(32)
  • SpringBoot整合RabbitMQ系列--绑定交换机与队列的方法

    原文网址:SpringBoot整合RabbitMQ系列--绑定交换机与队列的方法_IT利刃出鞘的博客-CSDN博客         本文用实例介绍SpringBoot中RabbitMQ如何绑定交换机(交换器)与队列。 交换机 下边两种方式等价。 队列 下边两种方式等价 绑定 下边两种方式等价 注意:第一种的参数并不是字符

    2023年04月09日
    浏览(35)
  • RabbitMQ队列及交换机的使用

    目录 一、简单模型 1、首先控制台创建一个队列 2、父工程导入依赖  3、生产者配置文件  4、写测试类 5、消费者配置文件 6、消费者接收消息 二、WorkQueues模型 1、在控制台创建一个新的队列 2、生产者生产消息 3、创建两个消费者接收消息 4、能者多劳充分利用每一个消费者

    2024年02月04日
    浏览(31)
  • 【RabbitMQ】交换机的概念及使用

            RabbitMQ中,交换机是一个核心概念,主要用来将生产者生产出来的消息,传送到对应的队列中。实际上,生产者生产的消息从不会直接发送到队列,而是发送到交换机。交换机一方面接收来自生产者的消息,另一方面将这些消息推入队列。 四种类型的交换机: 直

    2024年01月25日
    浏览(22)
  • 消息队列RabbitMQ.02.交换机的讲解与使用

    目录 RabbitMQ中交换机的基本概念与作用解析 交换机的作用: 交换机的类型: 直连交换机(Direct Exchange): 将消息路由到与消息中的路由键(Routing Key)完全匹配的队列。 主题交换机(Topic Exchange): 使用通配符匹配路由键,允许更灵活的消息路由。 扇形交换机(Fanout E

    2024年01月24日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包