延时队列的几种实现方案
Posted catoop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了延时队列的几种实现方案相关的知识,希望对你有一定的参考价值。
延时队列的特征
- 它是一个队列
- 是被延迟消费的(设定一个未来的某个时间点被消费)
延时队列的应用场景
- 订单成功后,在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)
以上是关于延时队列的几种实现方案的主要内容,如果未能解决你的问题,请参考以下文章