延时队列的几种实现方案(代码片段)

catoop catoop     2023-02-24     216

关键词:

延时队列的特征

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

延时队列的应用场景

  • 订单成功后,在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)

实现在线预览pdf的几种解决方案(代码片段)

原文:实现在线预览PDF的几种解决方案因客户需要实现PDF的预览处理,在网上找了一些PDF在线预览的解决方案,有的用PDFJS的在线预览方式,有的使用PDFObject的嵌入式显示,有的通过转换JPG/PNG方式实现间接显示的方式,开始是想... 查看详情

6种延时队列的实现方案(代码片段)

...官,就给大家整理分享一道面试题:“如何实现延时队列?”。下边会介绍多种实现延时队列的思路,文末提供有几种实现方式的 github地址。其实哪种方式都没有绝对的好与坏,只是看把它用在什么业务场景... 查看详情

rabbitmq:伪延时队列(代码片段)

目录一、什么是延时队列二、RabbitMQ实现三、延时队列的问题四、解决RabbitMQ的伪延时方案ps:伪延时队列先卖个关子,我们先了解下延时队列。一、什么是延时队列所谓延时队列是指消息push到队列后,监听的消费者不能第一时间... 查看详情

6种延时队列的实现方案(代码片段)

五一期间原计划是写两篇文章,看一本技术类书籍,结果这五天由于自律性过于差,禁不住各种诱惑,我连电脑都没打开过,计划完美宣告失败。所以在这能看出和大佬之间的差距,人家没白没夜的更文&#x... 查看详情

rabbitmq消息队列中的几种典型问题再探(代码片段)

转载请注明出处,作者:SoaringTigerhttp://blog.csdn.net/soaring_tiger/article/details/51039938RabbitMQ的官网教程当中展示了六个例子,但是并没有更深入的介绍在复杂需求下的解决方案本文将结合官网教程和《RabbitMQinAction》以及Pika官方... 查看详情

端口扫描器的几种代码实现方案(代码片段)

  搞安全的应该都知道端口扫描在渗透测试、漏洞扫描过程中的重要性,其与URL爬虫等技术构成了漏洞扫描的第一阶段,即目标信息收集。因此能否开发出一款高效稳定的端口扫描器,往往决定了漏洞扫描器的好坏。那么说到... 查看详情

android中实现延时执行操作的几种方法

参考技术A在这里记录一下几种实现延时执行操作的方法:1.使用线程的休眠实现延时操作2.使用TimerTask实现延时操作3.使用Handler的postDelayed方法实现延时操作推荐使用第三种 查看详情

每日一博-使用环形队列实现高效的延时消息(代码片段)

文章目录Pre方案A方案B总结Pre来个场景:24小时后将未进行某个Action的业务,执行另外一个动作。比如24小时未付款的订单,取消。你可能会说方案A来个定时呗,每隔半小时,扫描数据库订单表,将完成时... 查看详情

qt延时处理的几种办法(代码片段)

有些时候,我们需要程序延时一会儿:这里提供四种方法:1、多线程程序使用QThread::sleep()或者QThread::msleep()或QThread::usleep()或QThread::wait()进行延时处理。Sleep不会释放对象锁,其他线程无法访问对象,因此会阻塞线程;而Wait会释... 查看详情

rabbitmq实现延时队列(代码片段)

什么是延时队列指消息进入队列后不会立即被消费,可以被延迟一定的时间,再进行消费.RabbitMQ没有提供延迟队列功能,但是可以使用TTL+DLX来实现延迟队列效果使用场景电商平台下单后,30分钟未支付,取消订单回滚库存;新用户注... 查看详情

rabbitmq实现延时队列-springboot版本(代码片段)

 rabbitmq本身没有实现延时队列,但是可以通过死信队列机制,自己实现延时队列; 原理:当队列中的消息超时成为死信后,会把消息死信重新发送到配置好的交换机中,然后分发到真实的消费队列;步骤:1、创建带有时... 查看详情

rabbitmq安装延时队列插件实现延时队列(代码片段)

下载插件地址要注意和自己的rabbitmq的版本对应起来https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases我的mq是docker安装的3.9.7的下载完之后把插件copy到mq的plugin目录下,然后启用插件。之后重启容器,我这里是docker-com... 查看详情

异步并行任务实现的几种方案(代码片段)

当node中异步读取文件(在所有的同步任务执行完成之后执行的任务)操作,需要并行执行完成后调用某函数:constfs=require(‘fs‘);letuser=//异步读取文件;文件在根目录下fs.readFile(‘1.txt‘,‘utf-8‘,function(err,data)user[‘name‘]=data;)... 查看详情

redis实现延时队列(附完整代码)(代码片段)

...列和分布式队列而已,当然本文的重点在于redis实现延时队列啊,可能有人会说,用ribbitm 查看详情

text分布式唯一id的几种生成方案(代码片段)

查看详情

markdownjs实现继承的几种方式(代码片段)

查看详情

flutter设置圆角的几种方案(代码片段)

通过设置Container的decoration装饰器来实现Container(decoration:BoxDecoration(color:Colors.white,borderRadius:BorderRadius.circular(8),),child:Column(children:_rows(context),),);这种方式设置的圆角如果显示在四角的子控件设置了渐变,将会影响圆角显示通过... 查看详情

千万级延时任务队列如何实现,看美图开源的-lmstfy(代码片段)

千万级延时任务队列如何实现,看美图开源的-LMSTFY导读:Task是web开发中一个经典场景,我们时常需要延时任务,或者定时任务,通常都需要任务队列。常见的任务队列如celery,lmstfy是美图开源的任务队列。本文作者详细剖析了l... 查看详情