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

相关推荐
源代码•宸2 分钟前
GoLang八股(Go语言基础)
开发语言·后端·golang·map·defer·recover·panic
czlczl200209252 分钟前
OAuth 2.0 解析:后端开发者视角的原理与流程讲解
java·spring boot·后端
颜淡慕潇10 分钟前
Spring Boot 3.3.x、3.4.x、3.5.x 深度对比与演进分析
java·后端·架构
布列瑟农的星空10 分钟前
WebAssembly入门(一)——Emscripten
前端·后端
小突突突2 小时前
Spring框架中的单例bean是线程安全的吗?
java·后端·spring
iso少年2 小时前
Go 语言并发编程核心与用法
开发语言·后端·golang
掘金码甲哥2 小时前
云原生算力平台的架构解读
后端
码事漫谈2 小时前
智谱AI从清华实验室到“全球大模型第一股”的六年征程
后端
码事漫谈2 小时前
现代软件开发中常用架构的系统梳理与实践指南
后端
Mr.Entropy2 小时前
JdbcTemplate 性能好,但 Hibernate 生产力高。 如何选择?
java·后端·hibernate