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

    你可能感兴趣的文章
    Openlayers实战:绘制图形,导出geojson文件
    查看>>
    Openlayers实战:绘制图形,导出KML文件
    查看>>
    Openlayers实战:绘制多边形,导出CSV文件
    查看>>
    Openlayers实战:绘制带箭头的线
    查看>>
    Openlayers实战:输入WKT数据,输出GML、Polyline、GeoJSON格式数据
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
    查看>>
    Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
    查看>>
    Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>
    Openlayers高级交互(2/20):清除所有图层的有效方法
    查看>>
    Openlayers高级交互(3/20):动态添加 layer 到 layerGroup,并动态删除
    查看>>
    Openlayers高级交互(6/20):绘制某点,判断它是否在一个电子围栏内
    查看>>
    Openlayers高级交互(7/20):点击某点弹出窗口,自动播放视频
    查看>>
    Openlayers高级交互(8/20):选取feature,平移feature
    查看>>
    Openlayers:DMS-DD坐标形式互相转换
    查看>>
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>
    OpenLDAP(2.4.3x)服务器搭建及配置说明
    查看>>