RabbitMQ延迟消息的两种实现方式

简述RabbitMQ延迟消息的两种实现方式

前言

在实际业务中,往往会遇到例如:订单10分钟后过期、会议1小时后开始、商品3天后下架等等需求。

对于普通的消息队列,消息一旦被发送到队列内,消费者就可以直接消费,无法实现诸如过期订单的需求。

那么就需要特殊的技术来实现,RabbitMQ 中有两种实现方式:TTL +死信队列插件

TTL+死信队列

TTL 就是Time To Live ,也就是消息存活时间

可以选择为一个消息队列 设置TTL,或者为某条消息设置TTL,区别在于:

如果为消息队列 设置了TTL,那么当该消息队列中的消息存在时长达到了TTL,也就是该消息过期了,消息队列就会立刻将该消息丢弃。

如果为某条消息设置了TTL,消息队列只会在消息将被消费时才会进行TTL检查,如果检查发现该条消息过期了,才会将消息丢弃。也就是说,这种情况下,如果消息还没有要被消费,就算消息早已经过期很久了,也不会被丢弃。

丢弃 的消息,并不是被销毁了,而是被转移到死信交换机 里了,再由死信交换机路由死信队列,顾名思义,死信队列就是死信的消息队列。

当消息被检测到TTL 过期时,会被转移到死信交换机,再由死信交换机从多个死信队列 中选一个死信队列,将过期的消息,也就是死信 ,路由到该死信队列,消费者再从死信队列 中消费消息,也就实现了延迟消息(或者称为延迟队列)。

TTL的两种设置方式中,

如果为消息队列设置TTL,就会导致该消息队列内的每条消息都有固定的一样的TTL,如果想要提供更多的TTL选择,就需要提供更多的消息队列,灵活性不高。

如果为消息设置TTL,就会导致由于消息堵塞,过期消息并未即时转移到死信队列的情况,可用性不高。

两种TTL设置方式需具体业务具体分析。

插件

RabbitMQ官方 提供了一个插件:rabbitmq_delayed_message_exchange ,可以用来快速实现延迟消息

该插件可以让交换机本身具备延迟发送消息的功能,也就是延迟交换机

通过延迟交换机,可以灵活的为每条延迟消息设置一个延迟时间,延迟交换机会根据消息的延迟时间进行发送。

使用插件的方法,实现较为简易,延迟时间的灵活性较高,

TTL +死信队列的方法,由于是通过原生特性实现的,所以性能较高。

相关推荐
利刃大大16 小时前
【RabbitMQ】Simple模式 && 工作队列 && 发布/订阅模式 && 路由模式 && 通配符模式 && RPC模式 && 发布确认机制
rpc·消息队列·rabbitmq·队列
J_liaty1 天前
RabbitMQ面试题终极指南
开发语言·后端·面试·rabbitmq
maozexijr2 天前
RabbitMQ Exchange Headers类型存在的意义?
分布式·rabbitmq
独自破碎E2 天前
RabbitMQ的消息确认机制是怎么工作的?
分布式·rabbitmq
maozexijr2 天前
注解实现rabbitmq消费者和生产者
分布式·rabbitmq
Java 码农3 天前
RabbitMQ集群部署方案及配置指南09
分布式·rabbitmq
论迹3 天前
RabbitMQ
分布式·rabbitmq
Java 码农3 天前
RabbitMQ集群部署方案及配置指南08--电商业务延迟队列定制化方案
大数据·分布式·rabbitmq
Java 码农3 天前
Spring Boot集成RabbitMQ的各种队列使用案例
spring boot·rabbitmq·java-rabbitmq
vb2008113 天前
Ubuntu 系统下 RabbitMQ 作为 MQTT 代理的配置方案
mqtt·rabbitmq