超时订单处理——延迟消息队列RabbitMQ-TTL-Dead Letter Exchange
实现思路
-
定时任务轮询
编写定时任务,处理60分钟前的创建的订单。这种实现方案的缺点是时间精度不高,对系统压力比较大。
-
使用延迟消息队列
延迟消息队列,就是消息的生产者发送的消息并不会立刻被消费,而是在设定的时间之后才可以消费。
rabbitMQ延迟消息
延迟消息涉及到两个概念消息的TTL,与**死信交换器Dead Letter Exchange。
TTL(time to live)
相当于一个过期时间,当消息队列中的消息在队列存在指定时间未被消费后,就会从当前队列移除。
死信交换器Dead Letter Exchange
注意:这里是一个交换器而不是一个队列。
当满足以下的情况之一,就会进入死信交换器。
- 一个消息被Comsumer拒收了,并且reject方法的参数里requeue是false,也就是说不会被再次放在队列里,被其他消费者使用。
- 队列中的消息的TTL到了,消息过期。
- 队列长度限制满了,排在前面的消息会被丢弃,或转发到死信交换器。
Dead Letter Exchanges其实也是一种普通的exchange,和其他exchange没有两样。在某一个设置有死信交换器的队列中满足以上的三种情况就会自动触发消息的转发,发送到死信交换器中去。