实现延迟队列的几种方案

方案一:基于SpringTask定时扫描数据库

步骤: 把发布的任务和时间保存到数据库中之后使用定时任务SpringTask来进行每五分钟执行一次

优点:可以把任务持久化保存到数据库中,不容易丢失任务

缺点:这种方案发布的时间可能会有误差,因为五分钟才执行一次,如果缩短时间设置一分钟或者几十秒执行一次那么数据库压力非常大,所以这种方案不太理想

方案二 :基于jdk自带DelayQueue

步骤:DelayQueue 延时获取元素阻塞队列,队列根据任务的时间进行排序,使用while true循环不断的尝试从队列中取出任务

优点:这种方案执行速度非常快,因为所有的数据都存在JVM中

而且他的消费任务的时间非常准确

缺点:没有持久化保存当java程序出错了很有可以造成任务数据的丢失,所以这种方案也不太符合

方案三:基于rabbitMQ的死信队列

步骤:把消息放到一个队列中(这个队列没有消费者,给消息设置了超时时间TTL),当到了超时时间后变成死信,MQ把死信交给绑定好的死信交换机,由死信交换机在交给目标队列,监听者监听这个目标队列即可

优点:使用简单,mq帮我们管理了整个过程

可以持久化保存,不容易丢失任务

缺点:项目里必须要有rabbitMQ(我们项目中没有MQ所以这个方案也不太符合)

方案四:基于redis的Zset (redis中的Zset是有序不可重复的)

步骤:把延迟任务和时间储存到Zset中,定时扫描Zset取出任务进行消费

优点:这种方案性能好,有一定的持久化的能力,

缺点:这种方案项目里必须有redis

持久化能力不太强,

最终方案:我采用的是rebis和Mysql相结合的方式 MYsql保证了持久化保存

最终方案的总体流程

现将延时任务保存到数据库中,redis中的Zset定时获取数据库中五分钟内要执行的任务,

redis中的list(Redis中的list是双向链表,增删效率高)定时获取Zset中需要立即执行的任务,最后从list中获取任务进行消费

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
延时队列RabbitMQ 中的一个常见概念,它允许消息在一段延时后才会被消费者消费。这在某些场景下非常有用,例如需要在未来的某个特定时间才执行某个任务。 在 RabbitMQ实现延时队列几种方法,其中最常用的方法是使用插件 `rabbitmq_delayed_message_exchange`。这个插件允许你创建一个特殊的交换机,它支持对消息设置延时时间,然后将消息路由到延迟队列中。 具体实现步骤如下: 1. 确保你已经安装了 `rabbitmq_delayed_message_exchange` 插件。如果没有安装,可以通过运行 `rabbitmq-plugins enable rabbitmq_delayed_message_exchange` 命令来安装。 2. 创建一个类型为 `x-delayed-message` 的交换机,并将其配置为使用 `rabbitmq_delayed_message_exchange` 插件。你可以使用 RabbitMQ 的管理界面或者命令行工具来创建交换机。 3. 创建一个普通的队列,并将其绑定到延迟交换机上。 4. 在生产者发送消息时,设置消息的 `x-delay` 头部属性来指定延迟时间,单位是毫秒。消息会被发送到延迟交换机,并根据延迟时间被路由到延迟队列中。 5. 消费者从延迟队列中消费消息,延迟时间到达后才能获取到消息。 需要注意的是,延时队列并不是 RabbitMQ 的原生特性,而是通过插件来实现的。因此,在使用延时队列之前,你需要确保 RabbitMQ 已经安装了相应的插件。 希望这个回答对你有帮助。如果你还有其他问题,请随时提问!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值