RabbitMQ如何实现延迟队列

本文介绍了如何在RabbitMQ中通过TTL和死信队列实现延迟队列。首先解释了延迟队列的概念,接着详细阐述了TTL(Time To Live)的作用,即消息的存活时间,并说明了队列和消息的TTL设置。接着,解释了死信队列(DLX)的工作原理和消息成为死信的三种情况。最后,通过一个订单支付的场景,展示了如何配置Spring框架来创建和利用这两个机制实现延迟队列。
摘要由CSDN通过智能技术生成

1.延迟队列

延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。很可惜,在RabbitMQ中并未提供延迟队列功能,但是我们有其他的方式可以实现延迟队列,方法就是TTL+死信队列,组合实现延迟队列的效果。

2.什么是TTL

TTL,全称Time To Live,消息过期时间设置。消息的TTL就是消息的存活时间。RabbitMQ可以对队列和消息分别设置TTL。对队列设置就是队列没有消费者连着的保留时间,也可以对每一个单独的消息做单独的设置。超过了这个时间,我们认为这个消息就死了,称之为死信。

队列过期后,会将队列所有消息全部移除。 一个队列中某一个消息过期后,只有消息在队列顶端,才会判断其是否过期(移除掉),如果不在队列顶端,那么是无效的,过期时间有队列的过期时间判定。

如果队列设置了,消息也设置了,那么会取时间短的。所以一个消息如果被路由到不同的队列中,这个消息死亡的时间有可能不一样(不同的队列设置)。
我门一般通过设置消息的x-message-ttl属性来设置时间

3.死信队列

死信队列,英文缩写:DLX 。Dead Letter Exchange(死信交换机),当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。

消息成为死信的三种情况:

1. 队列消息长度到达限制;

2. 消费者拒接消费消息,basicNack/basicReject,并且不把消息重新放入原目标队 列,requeue=false;

3. 原队列存在消息过期设置,消息到达超时时间未被消费;

队列绑定死信交换机,给队列设置参数: x-dead-letter-exchange 和 x-dead-letter-routing-key,就能成功绑定了

Dead Letter Exchange其实就是一种普通的exchange,和创建其他exchange没有两样。只是在某一个设置Dead Letter Exchange的队列中有消息过期了,会自动触发消息的转发,发送到Dead Letter Exchange中去。

4.实现延迟队列

延迟任务通过消息的TTL和Dead Letter Exchange来实现。我们需要建立2个队列,一个用于发

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值