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

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

什么是死信交换机

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

  • 消费者使用basic.rejectbasic.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/

    你可能感兴趣的文章
    NVDIMM原理与应用之四:基于pstore 和 ramoops保存Kernel panic日志
    查看>>
    NVelocity标签使用详解
    查看>>
    NVelocity标签设置缓存的解决方案
    查看>>
    Nvidia Cudatoolkit 与 Conda Cudatoolkit
    查看>>
    NVIDIA GPU 的状态信息输出,由 `nvidia-smi` 命令生成
    查看>>
    nvidia 各种卡
    查看>>
    Nvidia 系列显卡大解析 B100、A40、A100、A800、H100、H800、V100 该如何选择,各自的配置详细与架构详细介绍,分别运用于哪些项目场景
    查看>>
    NVIDIA-cuda-cudnn下载地址
    查看>>
    nvidia-htop 使用教程
    查看>>
    nvidia-smi 参数详解
    查看>>
    Nvidia驱动失效,采用官方的方法重装更快
    查看>>
    nvmw安装node-v4.0.0之后版本的临时解决办法
    查看>>
    nvm切换node版本
    查看>>
    nvm安装 出现 Error retrieving “http://xxxx/SHASUMS256.txt“: HTTP Status 404 解决方法
    查看>>
    nvm安装以后,node -v npm 等命令提示不是内部或外部命令 node多版本控制管理 node多版本随意切换
    查看>>
    NXLog采集windows日志配置conf文件
    查看>>
    ny540 奇怪的排序 简单题
    查看>>
    NYOJ -216 A problem is easy
    查看>>
    NYOJ 1066 CO-PRIME(数论)
    查看>>
    NYOJ 737:石子合并(一)(区间dp)
    查看>>