【rabbitMq-3】 高级特性之延时机制

本文深入解析消息的TTL机制及死信队列的应用,探讨如何利用这两种机制处理消息过期和异常消费情况,特别是在电商系统订单支付场景下的应用。同时,介绍了基于rabbitmq_delayed_message_exchange插件的延迟队列实现方式。

本文会介绍消息的TTL机制,死信队列

一: TTL机制

TTL机制其实就是给队列 或者 消息设置过期时间,因为中间件的容量和堆积能力有限,有一些消息长时间消费不了,可使用过期来删除。 用法如下:

1. 通过Queue属性设置,队列中所有消息都有相同的过期时间-单位毫秒。
 
2. 对消息自身进行单独设置,每条消息的TTL 可以不同。

 

二:死信队列 

死信队列用来存放普通队列中不能正常消费的消息,如超时的,拒绝的,返回nack的等…

普通队列绑定了死信交换机就是死信队列; 而死信交换机也是普通交换机,只是在别的队列声明属性中,有个属性叫做:x-dead-letter-exchange,它的value指定的交换机,就成了死信交换机。 具体如图示:

当消息过期后,就会根据指定的routingKey发送到交换机,最终根据绑定key路由到死信队列。

 

三:应用场景

明白以上的TTL和死信队列后,我们可以做什么呢? 比如,电商系统,用户下了一个订单后需要支付,支付时间为15分钟,超时后将订单的未支付改为已取消,该怎么做呢?

做法一: 使用定时任务不断去扫描数据库中未支付的订单,看创建时间和当前时间是否大于15分钟,如果是改为已取消。

问题来了: 如果订单表数据量很大,频繁扫描会带来性能问题。  如果不够频繁,误差又会很大,不能及时更新状态。

做法二: 比如TTL和死信队列,生成订单后往mq发送一条消息(不去消费它),设置15钟过期,15分钟后发送到死信队列,监听死信队列的消费端拿到消息后,去查询订单,如果还是未支付,则改为已取消。

 

四:延迟队列

延迟队列其实就是TTL和死信队列的变相,只不过上面是把消息存在队列里实现过期,延迟队列是基于插件rabbitmq_delayed_message_exchange,把消息先发到x-delayed-message exchange延时交换机,到时间后再发送到队列。

此插件需要去下载,用法这里不作描述了。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值