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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 订单超时未支付自动取消--实现简述

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




01


定时轮询不可取


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


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


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


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




02


被动取消


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


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




03


主动取消


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



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


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


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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
支付系统39----支付宝支付,定时查单,每隔30秒执行1次,查询超过5分钟,并且未支付的订单
支付系统39----支付宝支付,定时查单,每隔30秒执行1次,查询超过5分钟,并且未支付的订单
|
9月前
|
iOS开发
如何让你的应用在后台可以继续处理未完事务
如何让你的应用在后台可以继续处理未完事务
74 1
|
4月前
|
消息中间件 NoSQL Java
订单出现超时未关闭场景解决方案
订单出现超时未关闭场景解决方案
209 5
|
4月前
|
消息中间件 监控 Java
微软一面:订单超时未支付,如何自动关闭?
本文探讨了微软面试中关于订单超时自动关闭的设计题,提供了四种解决方案:定时器轮询、被动关闭、MQ延时消息及分布式超时中心。每种方案均详细阐述了实现思路、优缺点及适用场景。强调架构应基于业务需求,而非盲目追求高大上。适合不同规模的企业参考选用。
96 4
|
9月前
|
消息中间件 NoSQL Kafka
订单超时取消的11种方式(非常详细清楚)
订单超时取消的11种方式(非常详细清楚)
3506 2
订单超时取消的11种方式(非常详细清楚)
支付系统40------定时查单-订单未创建,支付宝登陆前在支付宝端创建还是没有创建,不知道,之所以打印警告日志,是因为创建的时候更容易看到它
支付系统40------定时查单-订单未创建,支付宝登陆前在支付宝端创建还是没有创建,不知道,之所以打印警告日志,是因为创建的时候更容易看到它
支付系统34----支付成功异步通知,处理重复通知,我们在我们程序当中找到处理订单的processOrder方法,我们要在更新订单状态和记录日志之前,先处理重复通知
支付系统34----支付成功异步通知,处理重复通知,我们在我们程序当中找到处理订单的processOrder方法,我们要在更新订单状态和记录日志之前,先处理重复通知
支付系统42----支付宝支付-定时查单-订单已支付,如果我们在定时查单的状态中,我们明明已经支付的订单,却在本地状态中显示没有支付,这是因我们的异步通知因为种种原因没有接受到,支付宝端成功,本地失败
支付系统42----支付宝支付-定时查单-订单已支付,如果我们在定时查单的状态中,我们明明已经支付的订单,却在本地状态中显示没有支付,这是因我们的异步通知因为种种原因没有接受到,支付宝端成功,本地失败
|
7月前
|
JSON 数据格式
支付系统41----定时查单-订单未支付
支付系统41----定时查单-订单未支付
|
消息中间件 NoSQL Java
订单超时取消的11种方法(上)
大家好,我是三友~~ 延迟任务在我们日常生活中比较常见,比如订单支付超时取消订单功能,又比如自动确定收货的功能等等。 所以本篇文章就来从实现到原理来盘点延迟任务的11种实现方式,这些方式并没有绝对的好坏之分,只是适用场景
订单超时取消的11种方法(上)