摘要
死信队列,就像人生中的“死亡”,让人不寒而栗。但它也像“转世重生”,让信息得以再次传递。DLX,就像“转世”的桥梁,让信息得以重生。死信队列,虽然带着一丝忧伤,但也有着希望和重生的可能。
正文
消息队列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后才可以从序列中取下订单信息
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!
评论0