【RabbitMQ笔记10】消息队列RabbitMQ之死信队列的介绍

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

这篇文章,主要介绍消息队列RabbitMQ之死信队列。

目录

一、RabbitMQ死信队列

1.1、什么是死信队列

1.2、设置过期时间TTL

1.3、配置死信交换机和死信队列(代码配置)

(1)设置队列过期时间

(2)设置单条消息过期时间

(3)队列设置死信交换机

(4)配置的基本思路

1.4、配置死信交换机和死信队列(RabbitMQ管理界面配置)


一、RabbitMQ死信队列

1.1、什么是死信队列

在RabbitMQ中,并没有提供真正意义上的延迟队列,但是RabbitMQ可以设置队列、消息的过期时间,当队列或者消息到达过期时间之后,还没有被消费者消费,那么RabbitMQ会将这些消息放入另外一个队列,这个队列叫做:死信队列,而这个过期的消息就叫做:死信消息。

哪些情况下,消息会变成死信消息???

  • 第一种情况:Queue队列已经满了,无法保存新进入的消息,那么这个消息就会被放入死信队列。
  • 第二种情况:队列中的消息被消费者拒绝消费了,并且没有设置重新放入Queue队列里面。
  • 第三种情况:队列中的消息到了过期时间还没有被消费者消费。

死信队列需要通过一个死信交换机来分发死信消息,死信交换机是Dead Letter Exchange,简称:DLX。死信队列大致原理图如下所示:

死信队列,中间件笔记,java-rabbitmq,rabbitmq,延迟队列,死信队列,RabbitMQ消息中间件

1.2、设置过期时间TTL

RabbitMQ可以给Queue队列设置过期时间,也可以给单独的某一条消息Message设置过期时间,过期时间就是指消息存活时间,英文全称是Time To Live,简称:TTL。

  • 第一种方式:设置队列过期时间。
    • RabbitMQ可以给整个Queue队列设置过期时间,设置整个Queue过期时间,也就是设置这个队列中的所有Message消息的过期时间。
    • 这种方式不太灵活,因为如果每一个消息的延迟时间不一样,那么就需要保存到不同的Queue队列里面,给每一个Queue队列设置不同的过期时间,这样就会导致Queue队列非常的多。
    • 注意:通过队列的属性【x-message-ttl】设置队列的过期时间,单位是【ms】毫秒。
  • 第二种方式:设置单条消息过期时间。
    • RabbitMQ也支持给一个队列中的每一条Message消息设置过期时间,这种方式就更加灵活啦,同一个队列里面可以保存不同过期时间的消息,减少了队列的数量。
    • 这种方式也有一个缺点,那就是:每一条消息的过期时间不同,如果队列之前的消息没有被消费掉,那么后面的消息过期时间到了,也不会被剔除掉。
    • RabbitMQ剔除过期消息是在消费者消费之前判断是否过期的。
    • 举个例子:
      • 有A、B两条消息,A消息过期时间是10秒,B消息过期时间是5秒,并且A消息在B消息之前进入队列,5秒之后,A消息还没有被消费者消费掉,此时B消息到了过期时间,但是它不会立即从队列里面剔除,而是会在消费者消费B消息时候,判断B消息是否过期。
      • 当A消息消费结束之后,开始消费B消息,发现B消息已经过期,并且已经过期5秒,就会将这一条消息转发到死信交换机。
    • 注意:通过消息的【expiration】属性设置过期时间,单位是【ms】毫秒。

注意:可以同时设置队列和消息的过期时间,RabbitMQ会根据最短的时间来决定消息是否已经过期了。

1.3、配置死信交换机和死信队列(代码配置)

死信交换机和死信队列和普通的交换机、队列没有什么不同,只是叫法不同,在配置死信交换机和死信队列的时候,只需要给具体的业务队列配置死信交换机,然后给这个死信交换机绑定一个死信队列即可。

可以通过代码设置死信交换机和死信队列,也可以通过RabbitMQ提供的管理界面直接配置死信交换机和死信队列。在实际开发中,交换机和队列都是事先创建好的,之后生产者、消费者直接从指定的队列消费消息即可。

(1)设置队列过期时间

在声明队列的时候,给队列设置【x-message-ttl】属性即可。

// 6、指定需要操作的消息队列,如果队列不存在,则会创建
String queueName = "queue_demo_2023";
Map<String, Object> arguments = new HashMap<>();
arguments.put("x-message-ttl", "30000"); // 设置队列的过期时间
channel.queueDeclare(queueName, false, false, false, arguments);

(2)设置单条消息过期时间

在生产者发送消息的时候,通过【AMQP.BasicProperties】设置过期时间属性。

// 6、发送消息
String message = "RabbitMQ死信队列案例";
// TODO 设置消息的属性
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
        // 设置消息的过期时间是:30秒
        .expiration("30000")
        .build();
channel.basicPublish(exchangeName, "demo_key_2023", properties, message.getBytes());

(3)队列设置死信交换机

  • 声明队列的时候,通过给队列指定【x-dead-letter-exchange】属性,指定当前队列需要转发的死信交换机。
  • 通过【x-dead-letter-routing-key】属性,指定死信交换机绑定的路由键routingKey。
// 声明 Exchange,如果不存在,则会创建
channel.exchangeDeclare("exchange_demo_2023", "direct");
// TODO 声明死信交换机
channel.exchangeDeclare("exchange_dead_2023", "direct");

// 指定需要操作的消息队列,如果队列不存在,则会创建
// TODO 设置队列过期时间【业务队列】
Map<String, Object> arguments = new HashMap<>();
arguments.put("x-message-ttl", 10000); // 设置队列的过期时间
// 指定队列绑定的死信交换机名称
arguments.put("x-dead-letter-exchange", "exchange_dead_2023");
// 指定死信交换机的路由键routingKey
arguments.put("x-dead-letter-routing-key", "dead_key_2023");
channel.queueDeclare("queue_demo_2023", false, false, false, arguments);
// TODO 创建死信队列
channel.queueDeclare("queue_dead_2023", false, false, false, null);

// 绑定 Exchange 和 Queue
channel.queueBind("queue_demo_2023", "exchange_demo_2023", "demo_key_2023");
// TODO 死信队列绑定死信交换机
channel.queueBind("queue_dead_2023", "exchange_dead_2023", "dead_key_2023");

(4)配置的基本思路

  • 业务队列和业务交换机绑定。
  • 死信队列和死信交换机绑定。
  • 业务队列和死信交换机,是通过【x-dead-letter-exchange】和【x-dead-letter-routing-key】参数建立绑定关系的。

死信队列,中间件笔记,java-rabbitmq,rabbitmq,延迟队列,死信队列,RabbitMQ消息中间件

1.4、配置死信交换机和死信队列(RabbitMQ管理界面配置)

  • 第一步:创建业务交换机【busi_exchange_2023】。

死信队列,中间件笔记,java-rabbitmq,rabbitmq,延迟队列,死信队列,RabbitMQ消息中间件

  • 第二步:创建死信交换机【dead_exchange_2023】。

 死信队列,中间件笔记,java-rabbitmq,rabbitmq,延迟队列,死信队列,RabbitMQ消息中间件

  • 第三步:创建业务队列【busi_queue_2023】。
    • 设置【x-message-ttl】消息过期时间。
    • 设置【x-dead-letter-exchange】死信交换机。
    • 设置【x-dead-letter-routing-key】死信交换机的路由键routingKey。

死信队列,中间件笔记,java-rabbitmq,rabbitmq,延迟队列,死信队列,RabbitMQ消息中间件

  • 第五步:创建死信队列【dead_queue_2023】。

死信队列,中间件笔记,java-rabbitmq,rabbitmq,延迟队列,死信队列,RabbitMQ消息中间件

  • 第六步:业务队列【busi_queue_2023】绑定业务交换机【busi_exchange_2023】。

死信队列,中间件笔记,java-rabbitmq,rabbitmq,延迟队列,死信队列,RabbitMQ消息中间件

  • 第七步:死信队列【dead_queue_2023】绑定死信交换机【dead_exchange_2023】。

死信队列,中间件笔记,java-rabbitmq,rabbitmq,延迟队列,死信队列,RabbitMQ消息中间件

  • 第八步:通过前面七个步骤,已经配置好了死信队列和死信交换机啦,可以进行测试啦。

死信队列,中间件笔记,java-rabbitmq,rabbitmq,延迟队列,死信队列,RabbitMQ消息中间件

  • 第九步:查看业务队列和死信队列的变化情况。

死信队列,中间件笔记,java-rabbitmq,rabbitmq,延迟队列,死信队列,RabbitMQ消息中间件

到此,RabbitMQ中的死信队列就介绍完啦。

综上,这篇文章结束了,主要介绍消息队列RabbitMQ之死信队列。文章来源地址https://www.toymoban.com/news/detail-591852.html

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

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

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

相关文章

  • 「中间件」rabbitmq 消息队列基础知识

    RabbitMQ是一个消息队列软件,用于在应用程序之间转发消息。以下是RabbitMQ的基本概念: 消息:RabbitMQ中的消息是传递的基本单位,它由消息头和消息体组成。 队列(Queue):队列是消息的缓冲区,用于存储待处理的消息。 交换器(Exchange):交换器是接收生产者发送的消息并

    2024年02月07日
    浏览(39)
  • 深入详解高性能消息队列中间件 RabbitMQ

      目录 1、引言 2、什么是 RabbitMQ ? 3、RabbitMQ 优势 4、RabbitMQ 整体架构剖析 4.1、发送消息流程 4.2、消费消息流程 5、RabbitMQ 应用 5.1、广播 5.2、RPC VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...) https://blog.csdn.net/chenlycly/article/details/124272585 C++软件异常排查从入

    2024年02月05日
    浏览(33)
  • 消息队列中间件介绍

    消息队列介绍   消息队列中间件是大型系统中的重要组件,已经逐渐成为企业系统内部通信的核心手段。它具有松耦合、异步消息、流量削峰、可靠投递、广播、流量控制、最终一致性等一系列功能,已经成为异步RPC的主要手段之一。 目前常见的消息中间件有ActiveMQ、Rabbi

    2024年02月04日
    浏览(30)
  • 消息队列中间件 - Docker安装RabbitMQ、AMQP协议、和主要角色

    不管是微服务还是分布式的系统架构中,消息队列中间件都是不可缺少的一个重要环节,主流的消息队列中间件有RabbitMQ、RocketMQ等等,从这篇开始详细介绍以RabbitMQ为代表的消息队列中间件。 AMQP协议 AMQP协议是一个提供统一消息服务的应用层标准协议,基于此协议的客户端与

    2024年02月03日
    浏览(36)
  • 基于golang多消息队列中间件的封装nsq,rabbitmq,kafka

    场景 在创建个人的公共方法库中有这样一个需求,就是不同的项目会用到不同的消息队列中间件,我的思路把所有的消息队列中间件进行封装一个消息队列接口(MQer)有两个方法一个生产一个消费,那么在实例化对象的时候根据配置文件指定当前项目使用的那个消息队列中

    2024年02月14日
    浏览(37)
  • MQ(消息中间件)概述及 RabbitMQ 的基本介绍

    消息队列中间件是分布式系统中重要的组件,主要解决 应用解耦,异步消息,流量削锋等 问题,实现高性能,高可用,可伸缩和最终一致性架构。流量削锋 : 削减峰值压力(秒杀,抢购) MQ(Message Queue,消息队列)是典型的生产者、消费者模型。生产者不断向消息队列中

    2024年02月12日
    浏览(31)
  • 利用消息中间件RabbitMQ创建队列以及扇出(Fanout)、订阅(Direct)、主题(Topic)交换机来完成消息的发送和监听接收(完整版)

    目录 一、前期项目环境准备 1.1父项目以及子项目 1.2配置pom.xml 1.3配置application.yml 二、扇出(Fanout) 交换机实现消息的发送和接收 2.1编写子项目consumer(消费者,接收消息)的代码实现扇出(Fanout)交换机接收消息 2.1.1consumer子项目结构 2.1.2FanoutConfig类的实现扇出(Fanout)交

    2024年02月05日
    浏览(35)
  • 消息中间件学习笔记--RabbitMQ(二、模式,一次违反常规的Java大厂面试经历

    .Fanout:转发消息到所有绑定队列 比较常用的是Direct、Topic、Fanout. Fanout 这种Fanout模式不处理路由键,只·需要简单的将队列绑定到exchange上,一个发送到exchange的消息都会被转发到与该exchange绑定的所有队列上。很像广播子网,每台子网内的主机都获得了一份复制的消息。Fan

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

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

    2024年02月07日
    浏览(32)
  • RaabitMQ(三) - RabbitMQ队列类型、死信消息与死信队列、懒队列、集群模式、MQ常见消息问题

    这是RabbitMQ最为经典的队列类型。在单机环境中,拥有比较高的消息可靠性。 经典队列可以选择是否持久化(Durability)以及是否自动删除(Auto delete)两个属性。 Durability有两个选项,Durable和Transient。 Durable表示队列会将消息保存到硬盘,这样消息的安全性更高。但是同时,由于需

    2024年02月14日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包