本文由 发布,转载请注明出处,如有问题请联系我们! 发布时间: 2021-05-23消息队列RabbitMQ(五):死信队列与延迟队列
加载中消息队列RabbitMQ(五):死信队列与延迟时间序列
死信队列
前言
死信队列,英文简写:DLX 。Dead Letter Exchange(死信网络交换机),实际上应当称为死信网络交换机才更适当。
当信息变成Dead message后,能够被再次发送至另一个网络交换机,这一网络交换机便是DLX。
汇总:实际上死信队列便是一个一般的网络交换机,有一些序列的信息变成死信后,(例如到期了或是序列满了)这种死信一般状况下是会被 RabbitMQ 清除的。可是你能配备某一网络交换机因此序列的死信网络交换机,该序列的信息变成死信之后被再次发送至此 DLX 。对于怎么处理这一DLX中的死信便是看实际的业务场景了,DLX 中的信息内容能够被路由器到新的序列。
信息变成死信的三种状况
- 序列长短抵达限定,没法添加新的信息
- 顾客不接消費信息,而且不重返序列。该信息内容会被消除并进到死信队列
- 原序列存有信息到期设定,信息抵达请求超时時间未被消費
序列怎样关联 DLX
设定2个主要参数
- x-dead-letter-exchange 特定此序列的死信队列
- x-dead-letter-exchange 特定此序列向DLX推送死信的routing key,由于这个时候该序列等同于一个经营者,推送信息要特定routing key
完成实际效果:往一个一般序列加上信息,信息到期变成死信,进到死信队列。死信队列依据配备好的route key 路由器到与它关联的别的一般序列。
-
申明死信队列(一般网络交换机)
// 申明死信网络交换机 @Bean("deadExchange") public Exchange deadExchange(){ return ExchangeBuilder.topicExchange("sb_dead_exchange").durable(true) .autoDelete().build(); }
-
申明一般序列,配备它的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(); }
-
关联死信队列和一般序列,死信队列中的信息会依据路由器发送至别的序列
// 关联死信队列和一般序列 @Bean public Binding exchangQueue4(@Qualifier("queue2")Queue queue, @Qualifier("deadExchange") Exchange exchange){ return BindingBuilder.bind(queue).to(exchange).with("user4.#").noargs(); }
延迟时间序列
延迟时间序列,即信息进到序列后不容易马上被消費,仅有抵达特定時间后,才会被消費。經典的应用领域是提交订单减库存量。
预扣库存量的方式下,大家提交订单会马上减库存量,可是超出付款時间还没有付款得话该订单信息便会被撤销,库存量回退。
实际完成能够选用计时器的方法,按时查验获取当前时间与提交订单時间是不是超出限制,例如设定为30min。可是多长时间实行一次计划任务是个难题,精密度大(例如1s实行一次)得话数据库查询的工作压力十分大,精密度小(例如2min实行一次)得话又会产生差值。
如今选用的方法是选用延迟时间序列。RabbitMQ沒有给予延迟时间序列的作用。可是大家能应用死信队列 TTL 自身完成延迟时间序列。TTL時间为到期時间(如30min)。
大家为每条订单信息设定一个到期時间(30min),信息到期后变成死信,全自动进到死信队列,死信队列又把信息路由器到它关联的一般序列,库存系统定阅该序列就可以在30min后才取下该信息内容。间接性完成了延迟时间序列的作用
这般设计方案库存系统就一定只有在30min后才可以从序列中取下订单信息