博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
幂等性问题及解决方案
阅读量:4148 次
发布时间:2019-05-25

本文共 999 字,大约阅读时间需要 3 分钟。

      我们的系统大多拆分为分布式SOA,或者微服务,一套系统中包含了多个子系统服务,而一个子系统服务服务往往会去调用另外一个服务,而服务调用服务无非就是使用RPC通信或者restful,既然是通信,那么就有可能在服务器处理完毕后返回结果的时候挂掉,这个时候用户端发现很久没有反应,那么就会多次点击按钮,这样请求有多次,那么处理数据的结果是否要统一呢?那是肯定的!尤其再支付场景。

      幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了了副作用。举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额发现多扣了钱,流水记录也变成了两条。

      在以前的单应用系统中,我们只需要把数据操作放入事务中即可,发生错误立即回滚,但是再响应客户端的时候也有可能出现网络中断或者异常等等。

      在增删改查4个操作中,尤为注意就是增加或者修改,

      查询对于结果是不会有改变的,

      删除只会进行一次,用户多次点击产生的结果一样,

      修改在大多场景下结果一样

      增加在重复提交的场景下会出现

      那么如何设计接口才能做到幂等呢?

      方法一,单次支付请求,也就是直接支付了,不需要额外的数据库操作了,这个时候发起异步请求创建一个唯一的ticketId,就是门票,这张门票只能使用一次就作废,具体步骤如下:

      1.异步请求获取门票

      2.调用支付,传入门票

      3.根据门票ID查询此次操作是否存在,如果存在则表示该操作已经执行过,直接返回结果;如果不存在,支付扣款,保存结果

      4.返回结果到客户端

如果步骤4通信失败,用户再次发起请求,那么最终结果还是一样的.

      方法二,环境下各个服务相互调用

      这边就要举例我们的系统了,我们支付的时候先要扣款,然后更新订单,这个地方就涉及到了订单服务以及支付服务了。

      用户调用支付,扣款成功后,更新对应订单状态,然后再保存流水。

      而在这个地方就没必要使用门票ticketId了,因为会比较闲的麻烦

      (支付状态:未支付,已支付)

       步骤:

      1、查询订单支付状态

      2、如果已经支付,直接返回结果

      3、如果未支付,则支付扣款并且保存流水

      4、返回支付结果

  如果步骤4通信失败,用户再次发起请求,那么最终结果还是一样的 ,对于做过支付的朋友,幂等,也可以称之为冲正,保证客户

转载地址:http://qenti.baihongyu.com/

你可能感兴趣的文章
Linux initial RAM disk (initrd) overview
查看>>
Timestamping Linux kernel printk output in dmesg for fun and profit
查看>>
There's Much More than Intel/AMD Inside
查看>>
CentOS7 安装MySQL 5.6.43
查看>>
使用Java 导入/导出 Excel ----Jakarta POI
查看>>
本地tomcat 服务器内存不足
查看>>
IntelliJ IDAE 2018.2 汉化
查看>>
基于S5PV210的uboot移植中遇到的若干问题记录(一)DM9000网卡移植
查看>>
Openwrt源码下载与编译
查看>>
我和ip_conntrack不得不说的一些事
查看>>
Linux 查看端口使用情况
查看>>
文件隐藏
查看>>
两个linux内核rootkit--之二:adore-ng
查看>>
两个linux内核rootkit--之一:enyelkm
查看>>
关于linux栈的一个深层次的问题
查看>>
rootkit related
查看>>
配置文件的重要性------轻化操作
查看>>
又是缓存惹的祸!!!
查看>>
为什么要实现程序指令和程序数据的分离?
查看>>
我对C++ string和length方法的一个长期误解------从protobuf序列化说起(没处理好会引起数据丢失、反序列化失败哦!)
查看>>