RabbitMQ简单使用看这里,包括使用这个方案之前mq的配置环境
死信
Dead Letter exchanges (死信路由)
》一个消息在满足如下条件下,会进死信路由,注意是路由不是队列,一个路由可以对应多个队列。
.一个消息被消费者拒收了,并且reject方法的参数里requeue是false,也就是说不会被再次放到队列里,被其他消费者使用。
(basic.reject/basic.nack) requeue=false
.上面消息的TTL到了,消息过期了。
.队列的长度限制满了,排在前面的消息会被丢弃或者扔到死信路由上
》Dead Letter Exchange其实就是一种普通的exchange,和创建其他exchange没什么区别,只是在某一个设置Dead Letter Exchange的队列 中有消息过期,会自动触发消息的转发,发送到Dead Letter Exchange中去。
》我们即可以控制消息在一段时间后变成死信,又可以控制变成死信的消息被路由到某一个指定的交换机,结合二者,可以实现一个延迟队列。
延迟队列
实现定时任务
场景:比如未付款,超过一定时间后,系统自动取消订单并释放占有物品,也就是解库存。
解决方案springDe schedule 定时任务轮询数据库。
缺点:增加系统消耗,增加数据库压力,存在较大时间差
解决:Rabbitmq的消息TTL和死信队列EXchange结合