博客
关于我
如何解决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/

    你可能感兴趣的文章
    OpenSearch 使用二三事
    查看>>
    OpenSessionInView模式
    查看>>
    openshift搭建Istio企业级实战
    查看>>
    OpenSLL
    查看>>
    Openssh Openssl升级
    查看>>
    openssh 加固
    查看>>
    OPENSSH升级为7.4
    查看>>
    ViewPager切换滑动速度修改
    查看>>
    OpenSSL 引入了新的治理模式和项目,来增强社区参与和决策
    查看>>
    openssl内存分配,查看内存泄露
    查看>>
    OpenSSL创建SSL证书
    查看>>
    openssl在cygwin下编译错误:CPU不支持x86_64(CPU you selected does not support x86-64 instruction set )
    查看>>
    openssl安装
    查看>>
    openssl安装
    查看>>
    OpenSSL生成root CA及签发证书
    查看>>
    openStack instance error 恢复
    查看>>
    openstack instance resize to
    查看>>
    Openstack REST API
    查看>>
    OpenStack ussuri 私有云平台搭建企业级实战
    查看>>
    OpenStack 上部署 Kubernetes 方案对比
    查看>>