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

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

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

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

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

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

总结:

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

相关推荐
深蓝电商API2 小时前
分布式事务在跨境交易中的解决方案
分布式·跨境电商·代购系统·反向海淘·代购平台·跨境代购
我真会写代码6 小时前
从入门到精通:Kafka核心原理与实战避坑指南
分布式·缓存·kafka
黄俊懿8 小时前
【架构师从入门到进阶】第二章:系统衡量指标——第一节:伸缩性、扩展性、安全性
分布式·后端·中间件·架构·系统架构·架构设计
一叶飘零_sweeeet8 小时前
击穿 Kafka 高可用核心:分区副本、ISR 机制与底层原理全链路拆解
分布式·架构·kafka
007张三丰9 小时前
常用缓存技术全方位解析:从本地缓存到分布式缓存
分布式·缓存
tianyuanwo13 小时前
Koji 分布式编译调度机制深度解析:多架构异构节点的资源优化方案
分布式·架构
江沉晚呤时13 小时前
.NET 9 快速上手 RabbitMQ 直连交换机:高效消息传递实战指南
开发语言·分布式·后端·rabbitmq·.net·ruby
Volunteer Technology13 小时前
zookeeper基础应用与实战二
分布式·zookeeper·云原生
姚青&15 小时前
Pytest 测试用例并行运行与分布式运行
分布式·测试用例·pytest
若水不如远方1 天前
分布式一致性(六):拥抱可用性 —— 最终一致性与 Gossip 协议
分布式·后端·算法