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服务的类中添加新的方法,作为消费者进行消息接收

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

image.gif

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

@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("消息发送成功!");
    }

image.gif

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




总结

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

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
5月前
|
消息中间件 存储 Kafka
一文带你从入门到实战全面掌握RocketMQ核心概念、架构部署、实践应用和高级特性
本文详细介绍了分布式消息中间件RocketMQ的核心概念、部署方式及使用方法。RocketMQ由阿里研发并开源,具有高性能、高可靠性和分布式特性,广泛应用于金融、互联网等领域。文章从环境搭建到消息类型的实战(普通消息、延迟消息、顺序消息和事务消息)进行了全面解析,并对比了三种消费者类型(PushConsumer、SimpleConsumer和PullConsumer)的特点与适用场景。最后总结了使用RocketMQ时的关键注意事项,如Topic和Tag的设计、监控告警的重要性以及性能与可靠性的平衡。通过学习本文,读者可掌握RocketMQ的使用精髓并灵活应用于实际项目中。
4188 9
 一文带你从入门到实战全面掌握RocketMQ核心概念、架构部署、实践应用和高级特性
|
7月前
|
消息中间件 NoSQL 大数据
RocketMQ实战—5.消息重复+乱序+延迟的处理
本文围绕RocketMQ的使用与优化展开,分析了优惠券重复发放的原因及解决方案。首先,通过案例说明了优惠券系统因消息重复、数据库宕机或消费失败等原因导致重复发券的问题,并提出引入幂等性机制(如业务判断法、Redis状态判断法)来保证数据唯一性。其次,探讨了死信队列在处理消费失败时的作用,以及如何通过重试和死信队列解决消息处理异常。接着,分析了订单库同步中消息乱序的原因,提出了基于顺序消息机制的代码实现方案,确保消息按序处理。此外,介绍了利用Tag和属性过滤数据提升效率的方法,以及延迟消息机制优化定时退款扫描的功能。最后,总结了RocketMQ生产实践中的经验.
RocketMQ实战—5.消息重复+乱序+延迟的处理
什么是死信交换机 ? 如何为队列绑定死信交换机 ?
死 信交换机和正常的交换机没有什么不同 , 如果一个包含死信的队列配置了dead-letter-exchange属性,指定了一个交换机,那么队列中的死信就会投递到这个交换机中,而这个交换机称为死信交换机 为队列绑定死信交换机 , 只需要设置队列属性 dead-letter-exchange即可
|
消息中间件 存储 缓存
RabbitMQ:交换机详解(Fanout交换机、Direct交换机、Topic交换机)
RabbitMQ:交换机详解(Fanout交换机、Direct交换机、Topic交换机)
1293 7
RabbitMQ:交换机详解(Fanout交换机、Direct交换机、Topic交换机)
|
消息中间件 Java Kafka
RabbitMQ 入门
RabbitMQ 入门
232 0
|
消息中间件 存储 Java
分享一下rocketmq入门小知识
分享一下rocketmq入门小知识
290 0
分享一下rocketmq入门小知识
|
消息中间件 JSON Java
玩转RabbitMQ声明队列交换机、消息转换器
玩转RabbitMQ声明队列交换机、消息转换器
394 0
|
消息中间件 存储
RabbitMQ-死信交换机和死信队列
死信队列和死信交换机是RabbitMQ提供的一个非常实用的功能,通过合理使用这一机制,可以大大增强系统的健壮性和可靠性。它们不仅能有效解决消息处理失败的情况,还能为系统的错误追踪、消息延迟处理等提供支持。在设计系统的消息体系时,合理规划和使用死信队列和死信交换机,将会为系统的稳定运行提供一个有力的
242 0
|
消息中间件 Kafka Apache
kafka vs rocketmq: 不要只顾着吞吐量而忘了延迟这个指标
这篇文章讨论了Apache RocketMQ和Kafka的对比,强调RocketMQ在低延迟、消息重试与追踪、海量Topic、多租户等方面进行了优化,特别是在小包非批量和大量分区场景下的吞吐量超越Kafka,适合电商和金融领域等高并发、高可靠和高可用场景。
716 0

热门文章

最新文章

下一篇
oss云网关配置