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

    你可能感兴趣的文章
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_插入时如果目标表中已存在该数据则自动改为更新数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0058
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
    查看>>
    NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
    查看>>
    NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增加修改实时同步_使用JsonPath及自定义Python脚本_03---大数据之Nifi工作笔记0055
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
    查看>>
    NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现update数据实时同步_实际操作05---大数据之Nifi工作笔记0044
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
    查看>>
    NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065
    查看>>