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 +死信队列的方法,由于是通过原生特性实现的,所以性能较高。

相关推荐
AC赳赳老秦10 小时前
DeepSeek 辅助科研项目申报:可行性报告与经费预算框架的智能化撰写指南
数据库·人工智能·科技·mongodb·ui·rabbitmq·deepseek
Knight_AL11 小时前
线程池满了怎么办?用 RabbitMQ 做任务补偿不丢失
分布式·rabbitmq·ruby
坊钰13 小时前
【Rabbit MQ】Rabbit MQ 介绍
java·rabbitmq
小北方城市网14 小时前
RabbitMQ 生产级实战:可靠性投递、高并发优化与问题排查
开发语言·分布式·python·缓存·性能优化·rabbitmq·ruby
AC赳赳老秦2 天前
外文文献精读:DeepSeek翻译并解析顶会论文核心技术要点
前端·flutter·zookeeper·自动化·rabbitmq·prometheus·deepseek
invicinble3 天前
关于Rabbitmq在逻辑主体层面的配置
spring boot·rabbitmq·java-rabbitmq
I_Jln.3 天前
RabbitMQ+SpringAMQP 从入门到精通
分布式·rabbitmq
编程彩机3 天前
互联网大厂Java面试:从Spring Boot到消息队列的技术场景解析
java·spring boot·分布式·面试·kafka·消息队列·rabbitmq
洛阳纸贵4 天前
JAVA高级工程师--RabbitMQ消费者消息限流、超时、死信队列以及若依集成升级
java·rabbitmq·java-rabbitmq
福赖4 天前
《微服务即使通讯中RabbitMQ的作用》
c++·微服务·架构·rabbitmq