消息队列RabbitMQ(五):死信队列与延迟时间序列

死信队列

前言

死信队列,英文简写:DLX 。Dead Letter Exchange(死信网络交换机),实际上应当称为死信网络交换机才更适当。

当信息变成Dead message后,能够被再次发送至另一个网络交换机,这一网络交换机便是DLX。

image-20210519215444911

汇总:实际上死信队列便是一个一般的网络交换机,有一些序列的信息变成死信后,(例如到期了或是序列满了)这种死信一般状况下是会被 RabbitMQ 清除的。可是你能配备某一网络交换机因此序列的死信网络交换机,该序列的信息变成死信之后被再次发送至此 DLX 。对于怎么处理这一DLX中的死信便是看实际的业务场景了,DLX 中的信息内容能够被路由器到新的序列。

信息变成死信的三种状况

  • 序列长短抵达限定,没法添加新的信息
  • 顾客不接消費信息,而且不重返序列。该信息内容会被消除并进到死信队列
  • 原序列存有信息到期设定,信息抵达请求超时時间未被消費

序列怎样关联 DLX

设定2个主要参数

  • x-dead-letter-exchange 特定此序列的死信队列
  • x-dead-letter-exchange 特定此序列向DLX推送死信的routing key,由于这个时候该序列等同于一个经营者,推送信息要特定routing key

完成实际效果:往一个一般序列加上信息,信息到期变成死信,进到死信队列。死信队列依据配备好的route key 路由器到与它关联的别的一般序列。

  1. 申明死信队列(一般网络交换机)

        // 申明死信网络交换机
        @Bean("deadExchange")
        public Exchange deadExchange(){
            return ExchangeBuilder.topicExchange("sb_dead_exchange").durable(true)
                    .autoDelete().build();
        }
    
  2. 申明一般序列,配备它的DLX

        // 申明一般序列,关联死信队列
        @Bean
        public Queue queue3(){
            Queue build = QueueBuilder.durable("sb_dead_queue").build();
            build.addArgument("x-message-ttl",10000);
            build.addArgument("x-dead-letter-exchange","sb_dead_exchange");
            // 这时序列等同于经营者,因而要特定信息的routing key,死信队列能够更为routing key路由器到别的序列
            build.addArgument("x-dead-letter-routing-key","user4.info");
            return  build;
        }
        // 关联此序列和它的网络交换机
        @Bean
        public Binding exchangQueue3(@Qualifier("queue3")Queue queue,
                                     @Qualifier("topicExchange") Exchange exchange){
            return BindingBuilder.bind(queue).to(exchange).with("user3.#").noargs();
        }
    
  3. 关联死信队列和一般序列,死信队列中的信息会依据路由器发送至别的序列

        // 关联死信队列和一般序列
        @Bean
        public Binding exchangQueue4(@Qualifier("queue2")Queue queue,
                                     @Qualifier("deadExchange") Exchange exchange){
            return BindingBuilder.bind(queue).to(exchange).with("user4.#").noargs();
        }
    

    延迟时间序列

    延迟时间序列,即信息进到序列后不容易马上被消費,仅有抵达特定時间后,才会被消費。經典的应用领域是提交订单减库存量。

    image-20210519222253075

    预扣库存量的方式下,大家提交订单会马上减库存量,可是超出付款時间还没有付款得话该订单信息便会被撤销,库存量回退。

    实际完成能够选用计时器的方法,按时查验获取当前时间与提交订单時间是不是超出限制,例如设定为30min。可是多长时间实行一次计划任务是个难题,精密度大(例如1s实行一次)得话数据库查询的工作压力十分大,精密度小(例如2min实行一次)得话又会产生差值。

    如今选用的方法是选用延迟时间序列。RabbitMQ沒有给予延迟时间序列的作用。可是大家能应用死信队列 TTL 自身完成延迟时间序列。TTL時间为到期時间(如30min)。

    大家为每条订单信息设定一个到期時间(30min),信息到期后变成死信,全自动进到死信队列,死信队列又把信息路由器到它关联的一般序列,库存系统定阅该序列就可以在30min后才取下该信息内容。间接性完成了延迟时间序列的作用

    image-20210519224613611

    这般设计方案库存系统就一定只有在30min后才可以从序列中取下订单信息

评论(0条)

刀客源码 游客评论