场景:
当遇到消息量巨大的情况,mq爆满,导致消息堆积,消费者不能及时消费。
解决方案:
一,延迟消息。
顾名思义,就是延迟消息接收,延迟消费者消费消息。要做到延迟消费,我们需要知道在rabbitmq中有两个概念:
1)死信交换机。
死信(DL,dead-letter),顾名思义就是废弃死掉的信息。那么普通消息如何满足条件成为死信,则要满足下面三个条件之一。
(1)消费者使用 basic.reject 或者 basic.nack 声明消费消息失败,并且设置 require 为false。
(2)消息是一个过期消息,超时后无消费者消费。
(3)要投递的消息队列挤满了,无法到达队列的最早的消息。
死信的归属就是死信交换机,如果队列中配置了 dead-letter-exchange 属性,那么这个队列的死信就会被发送到这个交换机中,这个配置的交换机就被称为死
信交换机(DLX, Dead-Letter-Exchange)。
从正常队列到死信队列的过程,必须声明设置 死信交换机名称 和 死信队列与死信交换机绑定的路由key。
2)TTL(Time-to-Live)。
TTL(Time-to-Live)是消息的存活时间,单位是毫秒,当消息到达设置的TTL时间后,消息会被发送到死信队列。
TTL超时会有两种情况:
(1)消息所在的队列设置了超时时间。
(2)消息本身设置了过期时间。
延迟队列:上面通过死信交换机和TTL结合就实现了延迟队列。但是在rabbitmq中,已经提供了延迟队列的插件,我们只需要安装插件,就可以使用延迟队列。
延迟队列的插件:rabbitmq_delayed_message_exchange。
两种配置延迟队列的方式:
(1)使用@RabbitListener 注解,设置 delay 属性。delayed=true
(2)生命交换机和队列并绑定。发送消息时添加消息头"x-delay",指定延迟时间。
延迟队列的主要适用场景:
1,订单超时未支付,自动取消订单。
2,短信的延迟发送。
3,库存自动回滚。
二,惰性队列。
实现方式:
1,声明一个队列,设置lazy属性。
2,使用@RabbitListener 注解,设置lazy参数。
3,使用指令形式。将一个正在运行的队列变成惰性队列。
rabbitmqctl set_policy Lazy "^lazy-queue " ′ " q u e