订单超时未支付自动取消--实现简述

简介: 订单超时未支付自动取消--实现简述

很多交易场景下的订单都会设置一个支付时间,超过该时间则会自动取消该订单(或者叫已过期),本文将会简述我是如何去实现这一功能的。




01


定时轮询不可取


直接进行数据库定时轮询是很多人第一时间想到的方式,但并不可取,其原因主要有以下两点:


1、不论怎么设置轮询时间都不合适,由于用户提交订单的时间很随机,所以如果你设置每分钟定时轮询一次,那么理论上订单取消时间的最大误差就有一分钟,轮询的时间间隔越大,误差就越大,当然,你可能会说那干脆每秒都来一次,那我觉得还是先把你拖出去祭天了吧。


2、不论是对于服务器、还是数据库都过分占用资源,即使你在业务上能忍受一分钟的误差,每分钟轮询也是极其浪费资源的。


所以,直接使用定时轮询的方式不可取,但其还是可以作为一个保底的方式低频辅助使用(处理极端情况)。




02


被动取消


被动取消的方式很简单:只有当用户查询订单信息时,我们再判断该订单是否超时,如果超时再进行超时逻辑的处理。


但是这种方式依赖于用户的查询操作触发,这也就是说如果用户不进行查询订单的操作,该订单就永远不会被取消。




03


主动取消


为了避免轮询并且在服务端主动取消订单,可以使用类似于消息队列的方式,比如 redis 的 pub/sub 服务。



如上图所示,应用服务在成功提交订单(未支付)后,延时(时长就是支付的最大时间间隔)发布该订单到 redis 的自定义 channel ,而订单取消服务则订阅同一个 channel,一旦接收到消息则进行订单取消的逻辑处理。同时我们可以看到这种消息队列的方式很自然的解耦了服务。


另外在 node.js 中操作 redis 推荐你使用 ioredis 这个库,更简单好用。同时说到消息队列,就不得不提 MQ,专业的 MQ 肯定更加稳定可靠,但会附带更大的使用成本,若在这方面没有重点需求,岂非杀鸡用牛刀。


当然上述方式更推荐结合使用,本篇完。

目录
相关文章
|
安全 网络协议 5G
华为配置中心AP内漫游示例
WLAN不同的特性和功能需要在不同类型的模板下进行配置和维护,这些模板统称为WLAN模板,如域管理模板、射频模板、VAP模板、AP系统模板、AP有线口模板、WIDS模板。当用户在配置WLAN业务功能时,需要在对应功能的WLAN模板中进行参数配置,配置完成后,须将此模板引用到AP组或AP中,配置才会自动下发到RU,进而配置的功能在RU上生效。由于模板之间是存在相互引用关系的,因此在用户配置过程中,需要提前了解各个模板之间存在的逻辑关系。模板的逻辑关系和基本配置流程请参见WLAN业务配置流程。
323 1
|
消息中间件 数据库 RocketMQ
分布式事务常见解决方案
分布式事务常见解决方案
2834 0
|
消息中间件 缓存 监控
缓存与数据库一致性问题的解决策略
本文系统探讨了缓存与数据库一致性问题的根源及解决方案,涵盖Cache-Aside、Read/Write-Through等主流策略,结合分布式锁、消息队列、布隆过滤器等技术应对缓存穿透、击穿与雪崩,并提出版本控制、事件驱动等高级保障机制,辅以监控告警与最佳实践,助力构建高性能、高一致性的分布式系统。
397 0
|
消息中间件 NoSQL Kafka
订单超时取消的11种方式(非常详细清楚)
订单超时取消的11种方式(非常详细清楚)
8744 5
订单超时取消的11种方式(非常详细清楚)
|
9月前
|
JSON 安全 Serverless
MCP Server 之旅第 2 站: 从 0 到 1 - MCP Server 市场构建与存量 OpenAPI 转 MCP Server
本文聚焦MCP协议在企业应用中的两大核心痛点:如何将社区主流STDIO MCP Server一键转为可插拔Remote MCP Server,以及如何实现存量OpenAPI向MCP Server的智能化转型。文章通过具体示例,展示了基于函数计算和协议转译Adapter的解决方案,支持npm/pip生态,实现零改造一键迁移,大幅降低成本。
|
消息中间件 监控 Java
微软一面:订单超时未支付,如何自动关闭?
本文探讨了微软面试中关于订单超时自动关闭的设计题,提供了四种解决方案:定时器轮询、被动关闭、MQ延时消息及分布式超时中心。每种方案均详细阐述了实现思路、优缺点及适用场景。强调架构应基于业务需求,而非盲目追求高大上。适合不同规模的企业参考选用。
563 4
|
Linux
VirtualBox的Centos上安装GNOME桌面完整教程
在VirtualBox上的CentOS系统安装GNOME桌面环境的完整教程,通过执行一系列命令来安装EPEL软件源、GNOME桌面环境,并配置系统默认运行级别为图形界面。
344 0
|
消息中间件 NoSQL Java
订单超时取消的11种方法(上)
大家好,我是三友~~ 延迟任务在我们日常生活中比较常见,比如订单支付超时取消订单功能,又比如自动确定收货的功能等等。 所以本篇文章就来从实现到原理来盘点延迟任务的11种实现方式,这些方式并没有绝对的好坏之分,只是适用场景
订单超时取消的11种方法(上)
|
NoSQL Java 调度
订单超时取消的11种方法(下)
大家好,我是三友~~ 延迟任务在我们日常生活中比较常见,比如订单支付超时取消订单功能,又比如自动确定收货的功能等等。 所以本篇文章就来从实现到原理来盘点延迟任务的11种实现方式,这些方式并没有绝对的好坏之分,只是适用场景的不大相同。
订单超时取消的11种方法(下)
|
存储 监控 NoSQL
用Redis延时队列搞定订单超时业务
Redis延时队列利用Sorted Set实现定时任务,适用于订单超时、定时提醒等场景。通过设置消息到期时间戳作为分数,到期后从Sorted Set中获取并处理。Redisson客户端提供便捷实现,如Java示例所示,利用RBlockingDeque和RDelayedQueue管理队列。注意时间精度、资源消耗和锁机制等问题,适用于订单取消、服务延迟激活、定时提醒等业务。【5月更文挑战第1天】
520 0

热门文章

最新文章