延时队列的几种实现方案

延时队列的特征

  • 它是一个队列
  • 是被延迟消费的(设定一个未来的某个时间点被消费)

延时队列的应用场景

  • 订单成功后,在30分钟内没有支付,自动取消订单
  • 外卖平台发送订餐通知,下单成功后60s给用户推送短信
  • 如果订单一直处于某一个未完结状态时,及时处理关单,并退还库存
  • 淘宝新建商户一个月内还没上传商品信息,将冻结商铺等
  • ……

以上场景都可以考虑使用延时队列解决。

延时队列的实现

实现延时队列的方案不止一种,本文暂不对每种方案做详细说明,仅枚举有哪些可以实现以上需求的方案,每个方案的具体细节,互联网上都有成熟的例子可查询参考。

方案名称简述说明
DelayQueue延时队列JDK中提供了一组实现延迟队列的API,位于Java.util.concurrent包下DelayQueue内存级,适用于单机版程序,仅单机应用可推荐
Quartz定时任务为每个未来要执行的操作产生一个独立的定时任务集群级,不够精准,不推荐
Redis sorted set利用它的score属性,死循环程序每秒不断根据score获取超时的数据,然后触发超时操作集群级,多线程情况下注意控制数据被同时获取问题,相当于持续读redis,要求不复杂的情况下可以考虑
Redis过期回调修改配置开启Redis回调事件,在Redis的key被删除时会触发监听器集群级,Redis不保证回调事件成功与否所以客户端监听器非运行状态事件被丢弃不会重发。因为redis原理当key过期后不是立刻被删除所以这个回调不能保证时间准确性,可以结合zsort组合实现可靠性方案
RabbitMQ 延时队列新版RabbitMQ提供了延迟队列插件,需要单独开启插件使用,其原理是通过死信队列实现集群级,没有明显缺点,比较推荐
时间轮时间轮是一个算法,在 Netty、Akka、Quartz、ZooKeeper 、Kafka等组件中都有使用,适合做统一调度器内存级,如果需要集群级需要自己做更多实现和处理,要么应用于单机程序,要么用它来实现一个调度器,既简单又复杂

(END)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

catoop

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值