博客
关于我
如何解决RabbitMQ中的延迟消息问题
阅读量:806 次
发布时间:2019-03-25

本文共 2001 字,大约阅读时间需要 6 分钟。

什么是死信交换机

在消息队列系统中,死信(Dead Letter)是指那些无法被正常消费的消息。消息成为死信的条件包括:

  • 消费者使用basic.reject或basic.nack声明消费失败,并且消息的requeue参数设置为false。
  • 消息是一个过期消息,超时无人消费。
  • 投递的队列消息堆积满了,最早的消息可能成为死信。
  • 死信交换机的作用

    当一个队列配置了dead-letter-exchange属性并指定了一个交换机时,队列中的死信会被投递到这个交换机中。这个交换机被称为死信交换机(Dead Letter Exchange,简称DLX)。死信交换机就像一个垃圾桶,收集无法被正确处理的消息。

    TTL(消息超时时间)

    TTL(Time-To-Live)是消息或队列设置的超时时间。如果消息在TLT超时后仍未被消费,则会变为死信。TTL可以设置在两个地方:

  • 队列的TTL属性:超过队列设置的超时时间后,消息变为死信。
  • 消息的TTL属性:超过消息设置的超时时间后,消息变为死信。
  • 延迟队列

    延迟队列的概念

    延迟队列是一种通过TTL和死信交换机实现的消息模式,允许消息在指定时间后被消费者接收。这种模式的主要场景包括:

  • 延迟发送短信或邮件。
  • 用户下单后若未支付自动取消。
  • 预约会议后自动通知参会人员。
  • DelayExchange插件

    为了实现延迟队列,RabbitMQ提供了DelayExchange插件。插件原理如下:

  • 消息到达交换机时,检查消息是否携带x-delay属性。
  • 如果有x-delay属性,消息会被持久化到硬盘,等待指定时间再重新投递到指定队列。
  • 消息重新投递后,按照正常流程被消费者接收。
  • 安装DelayExchange插件

    基于Docker安装RabbitMQ时,可以通过以下步骤安装插件:

  • 将插件文件上传到RabbitMQ的插件目录。
  • 在RabbitMQ容器内启用插件。
  • 使用DelayExchange

    注解方式(推荐)

    在Spring应用中,可以通过注解声明延迟队列:

    @RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "delay_queue", durable = "true"),
    exchange = @Exchange(name = "delay_exchange", type = DirectExchange.class),
    key = "delay_key"
    ))
    public void processDelayMessage(String message) {
    // 消息处理逻辑
    }
    Bean方式

    在配置类中,可以手动声明交换机和队列:

    @Configuration
    public class DelayQueueConfig {
    @Bean
    public DirectExchange delayExchange() {
    return new DirectExchange("delay_exchange");
    }
    @Bean
    public Queue delayQueue() {
    return new Queue("delay_queue", true)
    .ttl(5000L) // 队列超时时间
    .deadLetterExchange("dead_exchange")
    .deadLetterRoutingKey("dead_key");
    }
    @Bean
    public Binding delayBinding() {
    return BindingBuilder.bind(delayQueue())
    .to(delayExchange())
    .with("delay_key");
    }
    }

    发送延迟消息

    发送消息时,需要在消息头中携带x-delay属性,指定延迟时间:

    Message message = MessageBuilder
    .withBody("hello, delay!".getBytes(StandardCharsets.UTF_8))
    .setDelay(20000L) // 延迟时间
    .build();
    rabbitTemplate.convertAndSend("delay_exchange", "delay_key", message);

    小结

    延迟队列通过TTL和死信交换机实现消息的延迟处理,适用于需要在指定时间后自动触发某些操作的场景。

    转载地址:http://xmfuk.baihongyu.com/

    你可能感兴趣的文章
    Python--Redis实战:第四章:数据安全与性能保障:第4节:复制
    查看>>
    python--基本代码规范
    查看>>
    Python--抽象类接口类
    查看>>
    PYTHON--欧拉习题二
    查看>>
    python--高级应用总结
    查看>>
    python-520表白代码,我看谁说程序员不懂浪漫,送你几套表白代码,一步到位
    查看>>
    Python-Asyncio TypeError:无法在‘;等待‘;表达式中使用对象DICT
    查看>>
    Python-AttributeError:‘;dict&39;对象没有属性‘;序列‘;
    查看>>
    Python-ldap:是否可以在不显式写入密码的情况下进行绑定?
    查看>>
    python出现 unknown encoding: idna 的处理方法
    查看>>
    Python出现 RuntimeError: dictionary changed size during iteration 的解决方法
    查看>>
    Python-numpy(2)数组的操作
    查看>>
    Python-Numpy的tile函数用法
    查看>>
    python-open函数
    查看>>
    Python-Pandas-将特定函数应用于给定级别-多索引数据框架
    查看>>
    python-queue队列通信
    查看>>
    python-ros No module named PyKDL
    查看>>
    python-social-auth 是否需要会话
    查看>>
    Python再获年度编程语言,微软或成最大赢家
    查看>>
    python-week5
    查看>>