延迟机制
延迟队列
- 延迟队列——消息进入到队列之后,延迟指定的时间才能被消费者消费
- AMQP协议和RabbitMQ队列本身是不支持延迟队列功能的,但是可以通过TTL(Time To Live)特性模拟延迟队列的功能
- TTL就是消息的存活时间。RabbitMQ可以分别对队列和消息设置存活时间
- 在创建队列的时候可以设置队列的存活时间,当消息进入到队列并且在存活时间内没有消费者消费,则此消息就会从当前队列被移除;
- 创建消息队列没有设置TTL,但是消息设置了TTL,那么当消息的存活时间结束,也会被移除;一般设置每个消息的存活时间相等,即使不等也要保持前面消息的存活时间小于后面消息,因为队列是满足先进先出原则的消费,只有第一个消息被消费才能到第二个消息,如果后面的消息存活时间很短,等到前面消息处理完,后面的消息也被移除了,就是后面是无效消息。
- 当TTL结束之后,我们可以指定将当前队列的消息转存到其他指定的队列
使用延迟队列实现订单支付监控
死信队列:没有消费者,但设置了消息TTL存活时间,等过期时间一到,所以消息要么转存到其他队列,要么移除。
实现流程图
**订单延时支付功能实现:**准备一个路由模式的交换机,一个死信队列存放消息,但是没有消费者消费它,一个queue2消息队列不存放消息,只接收死信队列转存的过期消息,有B服务消费queue2队列,这样就可以保障B服务会在30分钟后检查支付状态(因为一开始queue2没有存消息,B消费者不能消费,只有在30分钟后,死信队列转存过期消息到queue2,B才能消费)。
创建交换机和队列