死信队列和延迟队列介绍

死信(dead letter)

死信指的是无法被消费者正常消费的消息,在消息队列中,如RabbitMQ中,死信队列就是专门用来存储这些消息的队列.

死信的来源

1.当消费者设置为手动应答的时候,同时requeue=false(拒绝接受消息,将消息丢弃),此时这条消息就是死信.

2.消息超过了队列设置的TTL(超时时间),此时超过时间还没被处理的的就是死信.

3.队列满了.队列也可以设置长度,超过的就是死信.

死信队列的使用场景

对于RabbitMQ,当可以用死信队列来进行处理上面的三种情况.

当消费者1出现情况导致消息的消费异常,此时就可以将死信发送给死信队列,再让其他的消费者监听死信队列,这样可以防止死信影响正常的程序,改善和优化系统.

延迟队列(Delayed queue)

延迟队列指的是消息发送后,并不想直接给消费者,而是经过一段时间后再给消费者.

延迟队列可以实现很多场景,例如智能家电中想要家电在一定时间自动开启,此时可以将命令放入延迟队列中,当指令到设置时间就会自动发送到设备.

还有当用户注册后,可以在一定时间内发送短信,提升用户活跃度.

延迟队列的使用

在RabbitMQ中没有直接的延迟队列使用,但是我们可以通过TTL+死信队列的方式来实现.

例如需要一个10秒的延迟将消息发送给用户,我们可以将消息设置为10秒的过期时间,10秒过后,此时消息就过期了,再将这个消息发送给死信队列,在设置专门的消费者对死信队列监听,此时就模拟了延迟队列的实现.

但是此种方法实现的延迟队列会出现问题,RabbitMQ只会检查队首的消息是否过期,如果第二个消息的过期时间比队首短,此时就会等队首消息过期后在发送给死信队列.

延迟队列插件

RabbitMQ中有一个专门实现延迟队列的插件:https://www.rabbitmq.com/blog/2015/04/16/scheduling-messages-with-rabbitmq

对比

基于死信实现的延迟队列
优点: 1) 灵活不需要额外的插件⽀持
缺点: 1) 存在消息顺序问题 2) 需要额外的逻辑来处理死信队列的消息, 增加了系统的复杂性
基于插件实现的延迟队列
优点: 1) 通过插件可以直接创建延迟队列, 简化延迟消息的实现. 2) 避免了DLX的时序问题
缺点: 1) 需要依赖特定的插件, 有运维⼯作 2) 只适⽤特定版本

相关推荐
Bs_MoneyMagnet1 小时前
基于springboot+vue的生态果园采摘预约系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·毕业设计·计算机毕业设计
麻瓜code2 小时前
【JUC】AQS enq() 自旋入队
java
Zenova EdgeOS2 小时前
Python 工业边缘 redis-py 异步实战
开发语言·redis·python
Wang's Blog2 小时前
Java框架快速入门: Spring Security+OAuth2之核心角色与授权流程
java·spring·github
hai_android2 小时前
Kotlin Flow combine 源码剖析:一个 Channel 如何优雅合并多条流
android·java·kotlin
caoerzhong2 小时前
JeeWMS 开源仓库管理系统权限与域验证解析:Java WMS 如何把数据权限管到仓、货主与人
java·python·开源·vue
君顾12 小时前
西安 24 小时自助健身房系统开发实战指南
java·开发语言·健身房
用户094248568032 小时前
第9章:OpenJDK堆分代与 Serial/Parallel GC 基础
java·jvm
Wang's Blog3 小时前
Java框架快速入门: Spring Security+OAuth2之RBAC与角色分层实践
java·网络·spring