如何防止重复下单

文章目录

  • 一:重复下单与幂等性问题
  • 二:如何解决重复下单问题
  • 三:总结

一:重复下单与幂等性问题

用户在下单页面进行下单时,由于用户点击下单按钮 多次 、或者 重试策略导致在订单服务中接收到了 两次同样 的下单请求

什么情况下会重复下单

  1. 用户短时间内多次点击下单按钮
  2. 超时重试
  3. 用户APP强退/闪退之后重新下单

重复下单问题,本质上,就是下单操作的幂等性问题,说到底,就是接口幂等性。

二:如何解决重复下单问题

方案一:提交订单按钮置灰
浏览器端去拦住一部分请求,减少后端服务器的处理压力,达到过滤流量的效果。
方案一优点:简单。基本可以防止重复点击提交按钮造成的重复提交问题。
方案一缺点:前进后退操作,或者F5刷新页面等问题并不能得到解决。因为服务端这里没有加限制

方案二:请求唯一ID+数据库唯一索引约束(数据库层面做幂等)

  1. 当用户进入订单提交界面的时候,调用后端获取请求唯一ID,并将唯一ID值埋点在页面里面。
  2. 当用户点击提交按钮时,后端检查这个唯一ID是否用过,如果没有用过,继续后续逻辑;如果用过,就提示重复提交。
  3. 最关键的一步操作,就是把这个唯一ID 存入业务表中,同时设置这个字段为唯一索引类型,从数据库层面做防止重复提交

缺点:DB层面约束,并发量低

方案三:redis分布式锁 + token 推荐

  1. 用户点击提交订单按钮,服务端接受到请求后,通过规则计算出本次请求唯一ID值
    • 接口唯一ID:应用名+接口名+方法名+请求参数签名(请求header、body参数,取SHA1值)
  2. 使用redis的分布式锁服务,对请求 ID 在限定的时间内尝试进行加锁,如果加锁成功,继续后续流程;如果加锁失败,说明服务正在处理,请勿重复提交。
  3. 最后一步,如果加锁成功后,需要将锁手动释放掉,以免再次请求时,提示同样的信息。

思考:同一个用户可能就是想买两次相同的产品,可能说先买了一个,刚买完发现需要两个,再买一个同一个产品,所以这时候我们设计不能不让用户买,这种情况就是说能不能对唯一ID设计上来区分这次请求,如果说不能区分,那在我们业务上redis分布式锁的时间范围这要去设计准确点,比如说一次下单到支付需要多长时间,锁的时间设置为比这个时间稍大些,不能时间太长,这样用户第二次购买发现不让重复操作。当然前面只是一种思路,还比如能不能经过判断后唯一ID相同,但是不知道用户是不是想重复购买,这时候可以给用户提示:发现购买相同,是否继续,继续那就放行,不继续就拦截。

代码实现思路:使用AOP实现对业务token的无侵入生成
可以定义注解,在生成订单的方法上加该注解,AOP的逻辑就是生成唯一token,然后加锁,看加锁能不能成功,成功则放行执行后续逻辑,失败则表示重复下单,拦截。


万能方案
一锁二判三更新
一锁:先加锁,可以加分布式锁、悲观锁都可以,但是一定是一个互斥锁
二判:进行幂等性判断,可以基于状态机业务流水表数据库唯一索引等,进行重复操作的判断。
三更新:对数据进行更新,将数据进行持久化。

三:总结

防止重复下单,本质上就是先做重复判断,然后服务端做好幂等性控制,结合实际业务场景选择相应的方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv9改进策略 | Neck篇 | 2024.1最新MFDS-DETR的HS-FPN改进特征融合层(轻量化Neck、全网独家首发)

一、本文介绍 本文给大家带来的改进机制是最近这几天最新发布的改进机制MFDS-DETR提出的一种HS-FPN结构,其是一种为白细胞检测设计的网络结构,主要用于解决白细胞数据集中的多尺度挑战。它的基本原理包括两个关键部分:特征选择模块和特征融合…

【单调栈】力扣85.最大矩形

好久没更新了 ~ 我又回来啦! 两个好消息: 我考上研了,收到拟录取通知啦!开放 留言功能 了,小伙伴对于内容有什么疑问可以在文章底部评论,看到之后会及时回复大家的! 前面更新过的算法&#x…

《QT实用小工具·三十二》九宫格炫酷主界面

1、概述 源码放在文章末尾 项目实现了九宫格炫酷主界面,下面是项目demo演示: 项目部分代码如下: #pragma execution_character_set("utf-8")#include "frmmain.h" #include "ui_frmmain.h"frmMain::frmMain…

噪声系数测试之增益法

提到增益法测试噪声系数,大家并不陌生,这是一种简洁的测试方法,精度不如Y因子法,但是在某些测试场合,比如只有频谱仪而没有噪声头时,且待测件具有非常高的增益时,就可以使用增益法测试噪声系数。 增益法测试噪声系数的连接示意图如图1所示,其思路为:DUT输入端端接50 …

jsoup接收429,404错误用来接收json格式

1.代码用例 try { // 拿到当前剩余余下的钱Document doc Jsoup.connect(url).header("Authorization", "Bearer " apiKey).header("Content-Type", "application/json").header("Connection", "keep-aliv…

就业班 第三阶段(nginx) 2401--4.19 day3 nginx3

二、企业 keepalived 高可用项目实战 1、Keepalived VRRP 介绍 keepalived是什么keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。 ​ keepalived工作原理keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundan…

VirtualBox Manjaro Linux(kde)虚拟机扩容 增大硬盘存储空间

https://blog.csdn.net/m0_65274357/article/details/131965463 df -h发现/可用空间之后几百M了 文件系统 大小 已用 可用 已用% 挂载点 dev 2.0G 0 2.0G 0% /dev run 2.0G 1.2M 2.0G 1% /run /dev/sda1 40G 37…

【华为 ICT HCIA eNSP 习题汇总】——题目集17

1、以下哪项不属于网络层安全威胁? A、DDos攻击 B、钓鱼攻击 C、IP Spoofing D、IP地址扫描 考点:网络安全 解析:(B) 钓鱼攻击通常被认为是应用层的安全威胁,也有在网络层进行伪装实施钓鱼攻击,…

算法复杂度分析笔记

基本定义间的关系 算法介绍 算法分析 时间复杂度 用数量级刻画:忽略所有低次幂项和系数 eg1: eg2: eg3: eg4: 小结 空间复杂度 eg: 总结

在Linux操作系统中,修改文件目录权限常用的命令操作

修改文件的属主或者是属组 命令chown 用户名.用户组名,文件路径 如上图所示,使用命令 chown martin.caiwu /opt/test/1.txt 将文件1.txt的属主修改为martin 。 将文件1.txt的属组修改为caiwu 如上图所示,使用命令chown .jishu /opt/test/…

探索早期投资的奥秘:符文(Runes)生态系统的崛起

随着加密市场的迅速发展,投资者们对早期项目的关注越来越高。在这个充满变数和机遇的领域里,抢占先机意味着可能获得巨大的回报。符文(Runes)生态系统作为近期备受瞩目的项目之一,引发了众多投资者的兴趣。本文将深入探…

JAVA面向对象(下)(三、接口和代码块)

一、接口(难点、重点) 1.1 需求 声明一个抽象父类Animal,包含public abstract void eat(); 声明一个子类Bird,继承Animal, 重写eat方法 新增一个方法:public void fly() 声明一个Plane,没有…

Python实现本地视频/音频播放器

Python实现本地视频/音频播放器 在Python中,有几个库可以用于视频播放,但是没有一个库是完美的,因为它们可能依赖于外部软件或有一些限制。 先看介绍用Python实现本地视频播放器,再介绍用Python实现本地音乐播放器。 Python实现…

【御控物联】Java JSON结构转换(4):对象To对象——规则属性重组

文章目录 一、JSON结构转换是什么?二、术语解释三、案例之《JSON对象 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

探索异常传播:深入剖析Python中的错误处理机制

文章目录 1. 异常传播的基本原理2. 复杂的异常传播场景3. 再次抛出异常的意义是什么?4. 最佳实践与异常处理策略 理解异常传播(也称为异常冒泡)的过程是至关重要的。这一机制确保当在程序执行中发生错误时,错误能被有效地捕获和处…

【前端Vue】Vue3+Pinia小兔鲜电商项目第6篇:整体认识和路由配置,本资源由 收集整理【附代码文档】

Vue3ElementPlusPinia开发小兔鲜电商项目完整教程(附代码资料)主要内容讲述:认识Vue3,使用create-vue搭建Vue3项目1. Vue3组合式API体验,2. Vue3更多的优势,1. 认识create-vue,2. 使用create-vue创建项目,1. setup选项的写法和执行…

为什么选择TikTok直播专线而不是节点?

TikTok直播已成为许多商家的重要营销手段,而网络质量作为营销直播效果的关键因素,使得商家们开始应用TikTok直播专线。虽然与节点相比,专线的价格稍高,但更多商家都倾向于选择TikTok直播专线。那么,为什么TikTok直播更…

盒子模型之怪异盒模型

这个是标准盒模型 这个是怪异盒模型 box-sizing:content-box;默认是标准盒模型 box-sizing:border-box;是怪异盒模型&#xff0c;会挤压里面的内容&#xff0c;不管怎么设置边框始终都是当初设置的200px <!DOCTYPE html> <html lang"en"> <head>…

分类分析模型

目录 1.目的 2.内容 2.1决策树分类模型 2.2K近邻分类模型 3.代码实现 3.1分类分析模型 3.2K近邻分类模型 1.目的 掌握利用Python语言及相关库编写决策树分类分析模型的方法&#xff0c;所构建的决策树能够对给定的数据集进行分类。掌握利用Python语言及相关库编写K近邻分…

通过实例学C#之DateTime结构

介绍 表示公历中值范围为 0001 年 1 月 1 日 Anno Domini (Common Era) 到 9999 年 12 月 31 日。 构造函数 DateTime(Int32, Int32, Int32) 通过输入年月日数据来新建一个dateTime结构&#xff0c;此外&#xff0c;dateTime还有多个重载构造函数&#xff0c;这里就不详细介绍…