开发小技巧系列 - 如何防止重复生成订单

简介: 如何防止重复生成订单,数据幂等性的处理

开发小技巧系列文章,是本人对过往平台系统的设计开发及踩坑的记录与总结,给初入平台系统开发的开发人员提供参考与帮助。

重复生成数据,在实际的开发过程中是一个常见的问题,“重复生成订单”只是一个例子,从这个例子中,来说明怎么去防止出现这个问题,也给初入开发的人员提供参考。

怎么会出现这种问题呢?

情况1: 用户界面操作

用户在界面上连续点击多次“按钮”,由于网络或者后台处理时长的原因,浏览器对服务器发送多次HTTP请求,导致服务器接收到多次一模一样的数据,在数据库中生成多条一模一样的数据。

情况2: 后台接口对接/MQ消费

在做功能开发的过程,有时候需要跟其他业务系统进行对接,通过http或者MQ或者其他协议方式,来交互数据,由于网络或者其他原因(比如在MQ场景中,没有控制好锁),导致服务方多次执行同一份数据,生成一模一样的数据库记录。

“数据重复被处理”的问题,其实是数据幂等性的问题,可以使用幂等性的机制来解决,保证同一份数据的处理结果只有一个。那有什么解决办法呢?

方案一、前端处理

前端界面加loading/按钮置灰,即用户操作按钮过后,将操作过的按钮灰,不能连续点击,或者界面加上一个loading的效果,让用户进行等待。这是最普通的处理方式,能防住普通的用户,但是防不了通过接口调用(高级用户)。

方案二、预分配ID及加锁

预分配ID,在下单的场景中,可以预先分配一个ID(ID可由后台生成,或者前端生成),后台在处理数据时,对同一个ID,只处理一次,多次提交后台时,返回特殊状态码给前端(表示“操作在进行中,不要重复提交”),可以采用redis的锁来控制“预分配ID”。

方案三、数据唯一主键法

数据表唯一主键法,也是在数据提交前,预分配一个唯一的ID,或者拿业务的ID(如订单号),在消息的场景中,可以使用MQ的messageId。然后在数据库中新建一张表,用来存储收到的数据/消息,将预分配的ID设置为“唯一主键”, 只有当数据写入成功后,在执行业务处理,如果写失败,则返回不处理(重复数据/消息),这个场景在之前做商城时使用过,通过订单的消息来做各个维度的统计(前期未考虑到大量的消息的情况下,没有很好分配好锁的机制)。

这个方式适用于其他数据一致性的场景上,订单重复只是其中之一。

如果读者有更好的方法,可以回复。

开发小技巧系列文章:

1、 开发小技巧系列 - 库存超卖,库存扣成负数?

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
8天前
|
消息中间件 存储 缓存
如果对方没做幂等!记一次生产订单重复的反思
公司旧系统中发现一个严重bug:用户支付一年服务费,系统却将有效期增加了两年。经分析,原因是消息队列(MQ)向第三方服务发送了两次消息,且该接口未实现幂等性控制。此问题可能导致财务损失和信誉受损。解决方案包括:生产者端通过请求频率限制、幂等键等防重措施;消费者端利用缓存和数据库确保幂等性;消息队列层配置去重功能、TTL和死信队列等。
17 0
|
3月前
|
消息中间件 设计模式 SQL
谷粒商城笔记+踩坑(21)——提交订单。原子性验令牌+锁定库存
完成提交订单功能,并使用分布式事务方案,保证了订单提交的幂等性
谷粒商城笔记+踩坑(21)——提交订单。原子性验令牌+锁定库存
|
4月前
|
编解码
重构支付宝商家账单问题之在重构过程中,替换老账单如何操作
重构支付宝商家账单问题之在重构过程中,替换老账单如何操作
|
7月前
|
消息中间件 供应链 NoSQL
电商订单待支付(思路分析)
电商订单待支付(思路分析)
|
7月前
|
JSON API 数据格式
1688一件采购实现指南:含代码实现采购流程
1688是中国最大的B2B电子商务平台之一,提供了丰富的商品信息和采购服务。一键采购是1688平台的一项便捷功能,可以帮助用户快速完成采购流程,提高采购效率。本文将详细介绍如何使用1688一键采购功能,并通过代码示例演示如何实现一键采购的自动化操作。
|
Dubbo 应用服务中间件 数据库
浅谈订单重构之路
浅谈订单重构之路
180 0
|
消息中间件 JavaScript 小程序
支付系统就该这么设计,稳的一批!!
支付系统就该这么设计,稳的一批!!
|
SQL 前端开发 NoSQL
谈一谈大厂都怎么防止重复下单?
谈一谈大厂都怎么防止重复下单?
|
数据库
分布式系统如何防止重复下单?
分布式系统如何防止重复下单?
360 0
|
消息中间件 存储 数据库
回退库存流程分析|学习笔记
快速学习回退库存流程分析
174 0
回退库存流程分析|学习笔记