当前位置:网站首页>什么是幂等性
什么是幂等性
2022-08-08 14:35:00 【小刘学安卓】
什么是幂等性
幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额发现多扣钱了,流水记录也变成了两条。在以前的单应用系统中,我们只需要把数据操作放入事务中即可,发生错误立即回滚,但是再响应客户端的时候也有可能出现网络中断或者异常等等。
在增删改查4个操作中,尤为注意就是增加或者修改,查询对于结果是不会有改变的,删除只会进行一次,用户多次点击产生的结果一样,修改在大多场景下结果一样,增加在重复提交的场景下会出现。
那么如何设计接口才能做到幂等呢?
方法一:单次支付请求,也就是直接支付了,不需要额外的数据库操作了,这个时候发起异步请求创建一个唯一的ticketId,就是门票,这张门票只能使用一次就作废,具体步骤如下:
1、异步请求获取门票
2、调用支付,传入门票
3、根据门票ID查询此次操作是否存在,如果存在则表示该操作已经执行过,直接返回结果;如果不存在,支付扣款,保存结果
4、返回结果到客户端
如果步骤4通信失败,用户再次发起请求,那么最终结果还是一样的.
方法二:分布式环境下各个服务相互调用
这边就要举例我们的系统了,我们支付的时候先要扣款,然后更新订单,这个地方就涉及到了订单服务以及支付服务了。用户调用支付,扣款成功后,更新对应订单状态,然后再保存流水。而在这个地方就没必要使用门票ticketId了,因为会比较闲的麻烦(支付状态:未支付,已支付)
步骤:
1、查询订单支付状态
2、如果已经支付,直接返回结果
3、如果未支付,则支付扣款并且保存流水
4、返回支付结果
如果步骤4通信失败,用户再次发起请求,那么最终结果还是一样的
对于做过支付的朋友,幂等也可以称之为冲正,保证客户端与服务端的交易一致性,避免多次扣款。
以下为接口文档对于幂等的描述,通过请求id号来判断是否为同一个请求。
边栏推荐
猜你喜欢
【系统设计】S3 对象存储
进程和线程
[Redis] Bitmap and usage scenarios of bitmap (statistics of online people and user online status)
Fast DDS 共享内存测试例修改栈空间大小的方式-如改为30M
浅谈 Redis 的底层数据结构
JS-BOM-for, if (string to case)
直播卖货APP——为何能得到商家和用户的喜欢?
客户案例 | 提高银行信用卡客户贡献率
Code Casual Recording Notes_Dynamic Programming_322 Change Exchange
华为云会议初体验【华为云至简致远】
随机推荐
Make mistakes small yards artisan study room 】 【 the ladder of the progress of children
itk中生成drr整理
Code Casual Recording Notes_Dynamic Programming_322 Change Exchange
【LeetCode】761. Special binary sequence
JS加法器(DOM)
【小码匠自习室】叛逆的小孩,打死也不改
基于QWebassembly的一个数据库监测工具
JS-Bom-while(计算闰年)
基于SCL语言的模拟量平均值滤波FB库功能介绍及创建FB库的具体方法
Notes on synchronized modified classes
JS-BOM-factorial calculation
路由器——交换机——网络交换机:区别
全网最全的AItium Designer 16下载资源与安装步骤
shell三剑客-----sed命令
什么是发饰hair accessories?
现在网上开户安全么?接着证券开户选择哪个证券?
作为一个十年卷王,告诫你们年轻人应该如何才能认清自己的价值
2022年8月7日 暑假第四周总结
深度学习中的常见正则化方法(Regularization)以及优化器中的WeightDecay参数详解
shell regular expression, Three Musketeers grep command