定时轮询,DelayQueue,ZSet,TTL+DLX(建议收藏)

简介: 定时轮询,DelayQueue,ZSet,TTL+DLX(建议收藏)

业务场景

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

那么如何实现这种延时业务呢?通常有以下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)上。然后投递到死信队列中,重新消费。

image.png

四种方案对比

image.png

相关文章
|
Java 程序员 Apache
编程语言比拼之Java VS C++
Java和C++都是非常受欢迎的编程语言,各有各的优势和适用场景。以下是对它们的简要比较:
699 0
|
2月前
|
人工智能 运维 监控
让问题不过夜:交易领域“问诊”Agent实践
在日常研发支持中,工程师频繁穿梭于工单、群聊、舆情反馈与问题排查之间:一边解释业务规则与口径,一边追踪链路、查看日志、核对指标、执行补偿。这些工作高度碎片化、重复性强且严重依赖个人经验,导致响应效率低、处理质量不稳定、新人上手困难。 为此,我们围绕“研发支持中的问诊痛点”,构建了一个可持续运营的智能 Agent 系统。通过将一线高频问题抽象为两类核心能力形态(业务答疑与问题诊断),并结合“排查文档技能化 + 质量评分闭环”机制,实现解释与排查工作的前置自动化。该系统不仅“能跑”,更能持续迭代进化,显著缩短首响时间与平均解决时长,提升服务一致性与工程效能。
让问题不过夜:交易领域“问诊”Agent实践
|
6月前
|
Java 关系型数据库 MySQL
基于springboot的智慧家园物业管理系统
智汇家园管理系统基于Java与Spring Boot开发,结合MySQL数据库,采用B/S架构,实现社区信息化管理。系统涵盖业主信息、报修、缴费等功能,提升物业管理效率与居民服务体验,推动社区管理智能化、透明化发展。
|
分布式计算 算法 搜索推荐
阿里巴巴内部:2022年全技术栈PPT分享(架构篇+算法篇+大数据)
我只截图不说话,PPT大全,氛围研发篇、算法篇、大数据、Java后端架构!除了大家熟悉的交易、支付场景外,支撑起阿里双十一交易1682亿元的“超级工程”其实包括以下但不限于客服、搜索、推荐、广告、库存、物流、云计算等。 Java核心技术栈:覆盖了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。 大数据:Spark、Hadoop
|
8月前
|
机器学习/深度学习 运维 监控
故障不是洪水猛兽:聊聊智能运维的“自愈”体系该咋搭
故障不是洪水猛兽:聊聊智能运维的“自愈”体系该咋搭
391 6
|
7月前
|
前端开发 大数据 Java
城管综合执法办案系统的技术体系解析:从移动端到云端
城管综合执法办案系统融合云计算、大数据、AI等技术,实现执法流程智能化、移动化。涵盖案件管理、电子取证、数据协同与可视化分析,提升执法效率与规范化水平。
494 0
|
前端开发 安全 JavaScript
在阿里云快速启动Appsmith搭建前端页面
本文介绍了Appsmith的基本信息,并通过阿里云计算巢完成了Appsmith的快速部署,使用者不需要自己下载代码,不需要自己安装复杂的依赖,不需要了解底层技术,只需要在控制台图形界面点击几下鼠标就可以快速部署并启动Appsmith,非技术同学也能轻松搞定。
|
前端开发 JavaScript API
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
1695 0
|
jenkins 持续交付
Jenkins Pipeline 流水线 - Parameters 参数化构建
Jenkins Pipeline 流水线 - Parameters 参数化构建
1084 0
|
存储 Linux Docker
arm安装docker与docker-copose
现在,你已经成功在ARM架构的设备上安装了Docker和Docker Compose。你可以使用它们来管理容器和容器化应用程序。请注意,ARM设备上的Docker支持可能受到限制,某些容器可能不兼容。确保你的容器映像支持ARM架构,以便在ARM设备上正确运行。
3001 6

热门文章

最新文章