本文会介绍消息的TTL机制,死信队列
一: TTL机制
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延时交换机,到时间后再发送到队列。
此插件需要去下载,用法这里不作描述了。
本文深入解析消息的TTL机制及死信队列的应用,探讨如何利用这两种机制处理消息过期和异常消费情况,特别是在电商系统订单支付场景下的应用。同时,介绍了基于rabbitmq_delayed_message_exchange插件的延迟队列实现方式。
1431

被折叠的 条评论
为什么被折叠?



