使用RabbitMq实现延迟队列

本文介绍了在生产环境中如何使用RabbitMQ实现延迟队列,满足如用户下单半小时内未支付的订单处理需求。RabbitMQ的TTL特性允许设置消息或队列的存活时间,当超时后消息变为死信。DLX(Dead Letter Exchanges)则能将死信重新路由到特定队列。通过配置x-dead-letter-exchange和x-dead-letter-routing-key,可以控制死信的处理路径。
摘要由CSDN通过智能技术生成

延迟队列的需求:在生产环境中,出现用户下单后,需要在半个小时之内进行支付,如果半个小时之内未进行支付,该订单将被处理。这时候就需要使用到了延迟队列。

RabbitMq的特性

TTL(time to live)

RabbitMQ可以针对Queue设置x-expires 或者 针对Message设置 x-message-ttl,来控制消息的生存时间,如果超时(两者同时设置以最先到期的时间为准),则消息变为dead letter(死信)

RabbitMQ针对队列中的消息过期时间有两种方法可以设置:

  • 通过队列属性设置,队列中所有消息都有相同的过期时间
  • 对消息进行单独设置,每条消息TTL可以不同
  • 如果同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。消息在队列的生存时间一旦超过设置的TTL值,就成为dead letter
DLX(dead letter exchanges)

RabbitMQ的Queue可以配置x-dead-letter-exchange 和x-dead-letter-routing-key(可选)两个参数,如果队列内出现了dead letter,则按照这两个参数重新路由转发到指定的队列。

  • x-dead-letter-exchange:出现dead letter之后将dead letter重新发送到指定exchange
  • x-dead-letter-routing-key:出现dead letter之后将dead letter重新按照指定的routing-key发送
    队列出现dead letter的情况有:
  • 消息或者队列的TTL过期
  • 队列达到最大长度
  • 消息被消费端拒绝(basic.reject or basic.nack)并且requeue=false

延迟队列设置

@Configuration
public class RabbitConfig {
   

    /**
     * 方法rabbitAdmin的功能描述:动态声明queue、exchange、routing
     */
    @Bean
    public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
   
        RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
        //声明死信队列(Fanout类型的exchange)
        Queue deadQueue = new Queue(RabbitConstants.QUEUE_NAME_DEAD_QUEUE);
        // 死信队列交换机
        FanoutExchange deadExchange = new FanoutExchange(RabbitConstants.MQ_EXCHANGE_DEAD_QUEUE);
        rabbitAdmin.declareQueue(deadQueue);
        rabbitAdmin.declareExchange(deadExchange);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值