4种延时任务实现方案

RockerMQ4.x 延时消息原理、流程梳理~ RocketMq延时消息大致流程并不复杂,下面简单总结下当我们需要发送延时消息的时候,需要对消息设置延时级别,标明该消息是延时消息Broker收到延时消息后,会重新设置延时消息的topic、queueId,并备份消息原始的topic、queueId,之后写入到commitLogBroker会启动ScheduleMessageService,ScheduleMessageService会为每个延时级别启动一个延时任务(利用ScheduledThreadPoolExecutor) 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:xiangxianzui.github.io/
2020/02/延时任务实现方案

7727a46aac386d48f4aa56c6a9fdb1c6.png


业务场景

我们买火车票或者叫外卖的时候,下完单之后会跳转到支付页面,页面里通常会有一个计时器,要求在指定时间内完成支付,否则订单就会被自动取消。这就是延时任务的一个典型业务场景。分析这个场景,其实最关键的就是如何在订单超时的时候立即触发取消订单的动作。

那么如何实现这种延时业务呢?通常有以下4种方案。

定时任务轮询db

用户下单后db中会生成一条订单记录,记录了订单号、用户ID、创建时间、订单详情、订单状态等信息。假设超时时间是600秒,我们后台起一个定时任务,每隔固定时间运行一次,每次扫描db中的超时订单select * from order where createTime <= now()-600,然后取消查询到的订单。

这种方法实现简单,但是有很多缺点。超时时间通常是秒级的,如果定时任务每秒运行一次,那么就相当于每秒就要对订单表做一次扫描,这是相当消耗db资源的操作,因此定时任务一般不会设置为秒级;但是如果设置为分钟级,又会牺牲即时性,比如600秒超时,很有可能660秒的时候订单才被取消。

DelayQueue

JDK的DelayQueue(延迟队列)是无界阻塞队列,只有在延迟期满时才能从中获取元素。每生成一个订单,在把订单记录到db的同时,要把订单id等信息投递到延迟队列中去,队列会按照超时时间进行排序,最先超时的订单排在队列的头部;起一个单独的线程不断地从队列中摘取元素然后去做取消订单的动作。

这种方法最大的缺点就是没有将超时信息持久化,服务重启之后延迟队列的元素不会被恢复。

redis的zset

在redis中创建一个key是”delayOrders”的zset,每个member就是订单ID,member的score就是该订单的超时时间戳。我们每次从zset中取出score最小也就是最先超时的元素,判断其是否超时,如果超时就将其从zset中删除并取消订单,如果未超时就继续执行下一次循环。

RabbitMQ的TTL+DLX

RabbitMQ可设置消息过期时间(TTL),当消息过期后可以将该消息投递到队列上设置的死信交换器(DLX)上。然后投递到死信队列中,重新消费。

e7bf5f1d13fa314694b8b2bfe615665d.png

四种方案对比

f3435547fbd64c69ff25f0e516cdfbf4.png

欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

e34d6b63b9acc689d8f3441ba2593d7a.png

已在知识星球更新源码解析如下:

c8cc64d3693bfc4879601ebb2b3ea4f6.png

ea4a1305ded2bb46831f47901fd535b5.png

1ff9ec38cc17a7f58d5047c00819218a.png

eec097a7fab60073e5cc21d2c33dd1c6.png

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
FreeRTOS上手指南:在正点原子F4探索者上跑通你的第一个多任务(含串口/延时函数适配详解) 本文详细介绍了在正点原子F4探索者开发板上移植FreeRTOS并实现多任务LED控制的完整流程。从SysTick定时器适配、延时函数重构到串口中断协同,逐步讲解如何构建稳定的多任务系统。通过实战案例演示任务创建、优先级设置和调试技巧,帮助开发者快速掌握FreeRTOS在STM32F4平台上的应用。 阅读详情

相关推荐

Cortex-M4板子 UART中断实验思考

实验任务:1. PC 端发来绝对对时命令,如 SET12:56:03 或 12-56-03,自动将当前时间同步到12:56:03,并回之以当前时间解决方式:利用UARTHANDLER即UART中断实现非阻塞性赋值遇到问题与解决过程:1. 输出时间为乱码首先确认时间显示代码段正确 if (light_cnt == 60) { light_cnt = 0; if (light_cnt1 == 6...

tangnanshen的博客 1857

每个程序员都应该收藏的算法复杂度速查表

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 8:55 更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2020 超神之路,很肝~...

芋艿V 262

39文章解读与程序——EI\CSCD\北大核心《基于两阶段鲁棒优化算法的微网多电源容量配置》已提供下载资源

电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.《《《《《《《《更多资源还请持续关注本专栏》》》》》》》《《《《《《《《更多资源还请持续关注本专栏》》》》》》》论文与完整源程序_电网论文源程序的博客-优快云博客。电网论文源程序-优快云博客。

LIANG674027206的博客 1209

京东热 key 探测框架新版发布JD-hotkey,单机 QPS 可达 35 万

https://mp.weixin.qq.com/s/3URAvUF6zwxeF5Kkc1aWHA

文盲青年的博客 8831

Arduino跑通ssd1306_spi显示屏

代码首先,您需要下载两个库:● Adafruit GFX库,这是核心图形库,提供了一组通用的图形基元(点、线、圆等)。它需要与特定于硬件的库对应。● Adafruit SSD-1306 OLED显示库,这是基于SSD1306驱动程序的OLED显示器的库。解压缩这两个库并将它们添加到Arduino库文件夹中,然后运行Arduino IDE并从OLED库中打开SPI示例。

Leo ICer的博客 1494

SocraticLM: Exploring Socratic Personalized Teaching with Large Language Models

大型语言模型(LLM)被认为是推进智能教育的一项关键技术,因为它们展示了深入理解教学场景和为学生提供个性化指导的潜力。然而,当前个性化教学中基于LLM的应用主要遵循“问答”范式,学生被动地获得答案和解释。在本文中,我们提出了苏格拉底式教学模式(SocraticLM ),它实现了一种苏格拉底式的“发人深省”的教学范式,实现了真正的课堂教师的角色,让学生积极参与到真正掌握解决问题所需的思考过程中。

weixin_43961909的博客 2884

AsyncTool 京东多线程并行框架

然后在worker类中通过get(“id”)的方法,获取指定id的返回结果作为参数。通过.getWorkResult().getResult()获取具体的返回值。首先通过 .id(“id”) 方法想要获取参数的线程都编号,通过以上两个方法可以实现线程之间的串、并行等各种复杂的操作。以此类推创建worker1、和worker2。先添加repositories节点。然后添加如下maven依赖。如此,实现了线程的并行。定义一个worker。可以通过一下方法实现。

weixin_58286934的博客 3320

卫朋:IPD流程落地之产品开发验证阶段解读

IPD验证阶段

产品线负责人 1488

延迟队列实现,定时任务,关闭订单

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 8:55 更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2020 超神之路,很肝~...

芋艿V 490

【软件系统架构】系列四:嵌入式软件-NPU(神经网络处理器)系统及模板

NPU(Neural Processing Unit) 是专门用于人工神经网络推理与训练的处理器,具备高并行、低功耗、低延迟等特点。它是边缘 AI、自动驾驶、智能摄像头、语音识别等场景中的关键硬件。

moton2017的博客 2253

WPF+MVVM案例实战(二十三)- 阴影效果详解

通过附加属性实现阴影效果,通过改变不同的阴影属性值达到不同阴影效果

lingshuangcanxue 561

京东开源,牛逼哄哄的 JD-hotkey 到底有多强悍?

对任意突发性的无法预先感知的热点请求,包括并不限于热点数据(如突发大量请求同一个商品)、热用户(如爬虫、刷子)、热接口(突发海量请求同一个接口)等,进行毫秒级精准探测到。然后对这些热数据、热用户等,推送到该应用部署的所有机器JVM内存中,以大幅减轻对后端数据存储层的冲击,并可以由客户端决定如何使用这些热key(譬如对热商品做本地缓存、对热用户进行拒绝访问、对热接口进行熔断或返回默认值)。这些热key在整个应用集群内保持一致性。核心功能:热数据探测并推送至集群各个服务器。适用场景:

没有伞的孩子必须努力奔跑!—小林 655

【MeshLib & VTK】MeshLib PK VTK

本文分享三维几何处理库MeshLib,并将其与VTK进行对比,希望对各位小伙伴有所帮助!

qq_40041064的博客 1076

实现延时任务的 4 种实现方案!

一、应用场景在需求开发过程中,我们经常会遇到一些类似下面的场景:a. 外卖订单超过15分钟未支付,自动取消b. 使用抢票软件订到车票后,1小时内未支付,自动取消c. 待处理申请超时1天,...

Java技术栈,分享最主流的Java技术 5758

SAP物料主数据归档详解(物理删除)

顾问们的回答肯定的统一的不能,只能打上删除标记。物料设置好需要删除的物料号这里我们需要删除的物料是AG88,其中,若不选“考虑无删除标记的物料”,需要将需要归档的物料MM06打删除标记。平时在操作系统过程中经常会不小心创建出很多无用的物料主数据,但是系统只能通过MM06打上删除标记,但是物料最终在系统中还是可以查询到的。6、执行已设置变式的归档程序,执行完毕,点下图中的“Job”,每次执行完归档程序会产生两条作业。然后设置好开始的参数和假脱机的参数,三个都是绿灯就可以执行归档的操作,物理上删除物料主数据。

我小时候很黑的博客 5526

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

实现延时任务的 4 种实现方案

一、应用场景 在需求开发过程中,我们经常会遇到一些类似下面的场景: a. 外卖订单超过15分钟未支付,自动取消 b. 使用抢票软件订到车票后,1小时内未支付,自动取消 c. 待处理申请超时1天,通知审核人员经理,超时2天通知审核人员总监 d. 客户预定自如房子后,24小时内未支付,房源自动释放 那么针对这类场景的需求应该如果实现呢,我们最先想到的一般是启个定时任务,来扫描数据库里符合条件的数据,并对其进行更新操作。一般来说spring-quartz 、elasticjob 就可以实现,甚至自己写个 T

程序员麦冬的博客(公众号同名) 555

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【211期】 4 种延时任务实现方案

点击上方“Java精选”,选择“设为星标”别问别人为什么,多问自己凭什么!下方有惊喜,留言必回,有问必答!每天08:15更新文章,每天进步一点点...业务场景我们买火车票或者叫外卖的时...

Java精选 251

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

延时队列实现的几种姿势

击上方关注 “终端研发部”设为“星标”,和你一起掌握来源:r6d.cn/qE5f在开发中,往往会遇到一些关于延时任务的需求。例如生成订单30分钟未支付,则自动取消生成订单60秒后,给用户发短信对上述的任务,我们给一个专业的名字来形容,那就是延时任务。那么这里就会产生一个问题,这个延时任务和定时任务的区别究竟在哪里呢?一共有如下几点区别1、 定时任务有明确的触发时间,延时任务没有 2、 定时任务有执...

这个时代,作为程序员可能要学习小程序 395

订单30分钟未支付自动取消怎么实现?

目录了解需求方案 1:数据库轮询方案 2:JDK 的延迟队列方案 3:时间轮算法方案 4:redis 缓存方案 5:使用消息队列。

qq_42003636的博客 5678

面试官:生成订单 30 分钟未支付,则自动取消,该怎么实现?

这样可以看出定时轮由个 3 个重要的属性参数,ticksPerWheel(一轮的 tick 数),tickDuration(一个 tick 的持续时间)以及 timeUnit(时间单位),例如当 ticksPerWheel=60,tickDuration=1,timeUnit=秒,这就和现实中的始终的秒针走动完全类似了。结合以上两个特性,就可以模拟出延迟消息的功能,具体的,我改天再写一篇文章,这里再讲下去,篇幅太长。因此,方案二不是太推荐。对上述的任务,我们给一个专业的名字来形容,那就是延时任务。

m0_71777195的博客 236

一个nop是延时多少_【NOP】FLL2019 & WRO2019优秀&创意参考19.03.03

关注后第一时间获得比赛信息再也不用发愁没有好的方案参考啦!本次分享WRO小学组比较优秀的思路,外加FLL优秀、创意方案各一则。2019.03.031.WRO2019-小学组设计思路2.优秀-美国北卡州获奖方案330+3.创意-FLL延时机关(别睡着了)视 频正 文NO1:之前介绍过论坛大师YO_YO_ER的6仓设计,这次带来一个新的思路——4仓。两者都是使用多仓位将白色乘...

weixin_36465073的博客 163

拼夕夕订单超时未支付自动关闭实现方案!

“ 在开发中,往往会遇到一些关于延时任务的需求。例如:生成订单 30 分钟未支付,则自动取消;生成订单 60 秒后,给用户发短信。图片来自 Pexels对上述的任务,我们给一个专业的名字来...

JAVA高级架构 830

4*4无时延矩阵键盘(非阻塞)--附代码链接

在嵌入式开发中,矩阵键盘的扫描一直是一个基础但重要的话题。传统的方法往往让我们陷入"等待"的思维模式——检测按键、延时消抖、再次确认。这种方式简单直接,但就像在繁忙的十字路口让所有车辆都停下来等待一辆自行车通过一样,效率低下。。

杰杰桀桀桀的博客 410

ESP32定时器深度解析:从硬件原理到多任务调度实战

定时器是嵌入式系统的核心组件,负责精确计时与事件调度。其工作原理基于时钟源分频与计数器累加,通过设置报警值与自动重载实现周期性中断触发。这项技术对于实现多任务并行处理、传感器数据采集和电机控制等场景具有关键价值,能够有效替代阻塞式延时函数,提升系统响应效率与资源利用率。在ESP32开发中,硬件定时器与中断服务程序(ISR)的协同工作,为LED控制、PWM信号生成等应用提供了基础支持。本文聚焦ESP32定时器的配置技巧与常见问题排查,帮助开发者优化时序控制方案。

weixin_30599769的博客 370
上一篇: 年终奖多发 1 块,税后反而少 3W?
下一篇: 这样 PDF 的技术简历,HR 根本不想看!
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值