Rabbitmq的死信队列与如何利用死信队列实现延迟队列

如果设置了队列的 TTL 属性,那么一旦消息过期,就会被队列丢弃(如果配置了死信队列被丢到死信队列中)。而如果仅设置消息的 TTL 属性,即使消息过期,也不一定会被马上丢弃,因为消息是否过期是在即将投递到消费者之前判定的,如果当前队列有严重的消息积压情况,则已过期的消息也许还能存活较长时间;

还需要注意的一点是,如果不设置 TTL,表示消息永远不会过期,如果将 TTL 设置为 0,则表示除非此时可以直接投递该消息到消费者,否则该消息将会被丢弃。

上文中提到的问题,确实是一个问题,如果不能实现在消息粒度上的 TTL,并使其在设置的TTL 时间及时死亡,就无法设计成一个通用的延时队列。那如何解决呢,我们可以通过 Rabbitmq 自带的延时队列插件解决这个问题。

这个就是声明一个延迟交换机实现需求

在我们自定义的交换机中,这是一种新的交换类型,该类型消息支持延迟投递机制 消息传递后并不会立即投递到目标队列中,而是存储在 mnesia(一个分布式数据系统)表中,当达到投递时间时,才投递到目标队列中。

总结:

RabbitMQ 实现延迟队列有两种方式,一种是通过死信来实现,其中又细分为设置队列的TTL和消息的TTL两种,原理就是消息在指定的时间过期后会通过死信交换机进入到死信队列,最后被消费者消费,不过基于消息到TTL来实现会存在消息积压而导致没有在后面发送到消息没有在指定延迟时间被消费的情况,因为该情况本质上是遵循先来先到的原则,先发送的消息延迟时间到了后才继续处理后面的消息;另一种是通过 RabbitMQ 的插件来实现,该插件的原理就是是消息在交换机处延迟,也就是生产者发送消息到延迟交换机等待指定时候才路由到队列中由消费者消费,该方式简单而且能避免上述问题,只需要一个延迟交换机即可实现,不需要死信交换机和死信队列。

相关推荐
初次攀爬者19 小时前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者3 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧4 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖4 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农4 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者4 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端
业精于勤_荒于稀4 天前
物流订单系统99.99%可用性全链路容灾体系落地操作手册
分布式
Ronin3054 天前
信道管理模块和异步线程模块
开发语言·c++·rabbitmq·异步线程·信道管理
Asher05094 天前
Hadoop核心技术与实战指南
大数据·hadoop·分布式
凉凉的知识库4 天前
Go中的零值与空值,你搞懂了么?
分布式·面试·go