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

本文涉及的产品
云数据库 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
目录
相关文章
|
4月前
|
消息中间件 NoSQL Kafka
订单超时取消的11种方式(非常详细清楚)
订单超时取消的11种方式(非常详细清楚)
652 1
订单超时取消的11种方式(非常详细清楚)
|
4月前
|
NoSQL Java 调度
订单超时取消的11种方法(下)
大家好,我是三友~~ 延迟任务在我们日常生活中比较常见,比如订单支付超时取消订单功能,又比如自动确定收货的功能等等。 所以本篇文章就来从实现到原理来盘点延迟任务的11种实现方式,这些方式并没有绝对的好坏之分,只是适用场景的不大相同。
订单超时取消的11种方法(下)
|
4月前
|
消息中间件 NoSQL Java
订单超时取消的11种方法(上)
大家好,我是三友~~ 延迟任务在我们日常生活中比较常见,比如订单支付超时取消订单功能,又比如自动确定收货的功能等等。 所以本篇文章就来从实现到原理来盘点延迟任务的11种实现方式,这些方式并没有绝对的好坏之分,只是适用场景
订单超时取消的11种方法(上)
|
11月前
筛选拆单后订单状态全部为已取消状态的订单有哪些
筛选拆单后订单状态全部为已取消状态的订单有哪些
50 0
|
消息中间件 Java 程序员
订单支付超时,自动关闭订单实现
今天跟大家一起探讨一个场景:用户对商品下单,约定30分钟没支付,超时订单将被系统自动关闭。
334 0
订单支付超时,自动关闭订单实现
|
消息中间件 存储 资源调度
订单超时怎么处理?我们用这种方案
在电商业务下,许多订单超时场景都在24小时以上,对于超时精度没有那么敏感,并且有海量订单需要批处理,推荐使用基于定时任务的跑批解决方案。
1019 0
订单超时怎么处理?我们用这种方案
|
程序员 测试技术 数据库
实战! 项目单据确认状态未更新排查
实战! 项目单据确认状态未更新排查
|
前端开发 应用服务中间件 API
订单异步通知修改订单状态
订单异步通知修改订单状态
订单异步通知修改订单状态
|
消息中间件 数据库 RocketMQ
取消订单|学习笔记
快速学习取消订单
77 0
|
消息中间件 SQL NoSQL
借助 redis 的 key 失效通知设置优惠券状态| 学习笔记
快速学习借助 redis 的 key 失效通知设置优惠券状态。
178 0
借助 redis 的 key 失效通知设置优惠券状态| 学习笔记