RabbitMQ入门指南(十):延迟消息-死信交换机

前言

RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了死信交换机、死信交换机实现延迟消息等内容。


一、死信交换机

死信交换机在 RabbitMQ 中是一个非常重要的概念,它主要用于处理那些在队列中无法正常处理的消息。

1.死信的定义

在 RabbitMQ 中,当一个消息在队列中满足以下条件时,它会被标记为死信:

  • 消费者使用 basic.reject 或 basic.nack 命令声明消费失败,并且消息的 requeue 参数设置为 false。
  • 消息是一个过期消息,超时无人消费。
  • 要投递的队列消息满了,无法投递。

2.死信交换机的作用

死信交换机的主要作用是集中处理无法正常处理的消息:

  • 收集那些因处理失败而被拒绝的消息。
  • 收集那些因队列满了而被拒绝的消息。
  • 收集因TTL(有效期)到期的消息。

当一个队列中的消息成为死信后,如果这个队列通过dead-letter-exchange 属性指定了一个交换机,那么队列中的死信就会投递到这个交换机中,而这个交换机就称为死信交换机。通过这种方式,可以将各种原因导致的失败消息集中到一个特定的地方,以便于分析和处理。

二、死信交换机实现延迟消息

1.案例解析

案例模型:

案例分析:

  1. publisher服务 发送一条消息到simple.direct ,RoutingKey为dead,并设置消息的 TTL 为 10000 毫秒(10秒)。
  2. 消息会被投递到simple.queue,由于没有消费者,10秒之后,消息的有效期到期,成为死信。
  3. 死信被再次投递到死信交换机dlx.direct
  4. 最终消息被成功路由到dlx.queue ,由consumer服务进行消息接收。

2.实现步骤

在RabbitMQ管理控制台新建交换机dlx.direct:

在RabbitMQ管理控制台新建队列dlx.queue:

绑定队列到交换机,指定RoutingKey:

在RabbitMQ管理控制台新建交换机simple.direct:

在RabbitMQ管理控制台新建队列simple.queue,并通过dead-letter-exchange 属性指定交换机(队列中的死信就会投递到这个交换机中,这个交换机称为死信交换机):

查看新建结果:

绑定队列到交换机,指定RoutingKey:

在consumer服务的类中添加新的方法,作为消费者进行消息接收

typescript 复制代码
    @RabbitListener(queues = "dlx.queue")
    public void listenDlxQueue(String msg){
        log.info("dlx.queue:" + msg);
    }

在publisher服务中的测试类添加一个测试方法,设置RoutingKeydead ,设置消息的 TTL10000 毫秒 (10秒),实现消息发送

java 复制代码
    @Test
    void testSendTTLMessage() {
        rabbitTemplate.convertAndSend("simple.direct", "dead", "Dead letter test", new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setExpiration("10000");
                return message;
            }
        });
        log.info("消息发送成功!");
    }

运行结果(Publisher服务成功发送了一条消息,但Consumer服务在10秒后才收到该消息,从而实现了延迟消息传递的目标):


总结

RabbitMQ是一个开源的消息队列软件,旨在提供可靠的消息传递和消息队列功能。本文主要介绍了死信交换机、死信交换机实现延迟消息等内容,希望对大家有所帮助。

相关推荐
.生产的驴10 分钟前
SpringBoot 消息队列RabbitMQ 消费者确认机制 失败重试机制
java·spring boot·分布式·后端·rabbitmq·java-rabbitmq
苹果酱05671 小时前
一文读懂SpringCLoud
java·开发语言·spring boot·后端·中间件
掐指一算乀缺钱2 小时前
SpringBoot 数据库表结构文档生成
java·数据库·spring boot·后端·spring
计算机学姐4 小时前
基于python+django+vue的影视推荐系统
开发语言·vue.js·后端·python·mysql·django·intellij-idea
JustinNeil4 小时前
简化Java对象转换:高效实现大对象的Entity、VO、DTO互转与代码优化
后端
青灯文案14 小时前
SpringBoot 项目统一 API 响应结果封装示例
java·spring boot·后端
微尘85 小时前
C语言存储类型 auto,register,static,extern
服务器·c语言·开发语言·c++·后端
计算机学姐5 小时前
基于PHP的电脑线上销售系统
开发语言·vscode·后端·mysql·编辑器·php·phpstorm
月夜星辉雪6 小时前
【RabbitMQ 项目】服务端:路由交换模块
分布式·rabbitmq
super_journey6 小时前
RabbitMq中交换机(Exchange)、队列(Queue)和路由键(Routing Key)
分布式·中间件·rabbitmq