前言
之前去华为面试的时候,面试官问了我一个问题:如何在客户端不断点击按钮的情况下如何实现多次接口调用实际上是一次接口调用的功能。当时我回答的是在redis里存储一个结构体把相关信息存在结构体里。直到在实习过程中发现有直接定义,叫做幂等,故而来学习一下。
一、幂等是什么?
在编程中,幂等 的理解就是,在数据不变的情况下,一个操作,无论执行多少次,结果都是一样的。为什么叫幂等呢?意思是N次操作和一次操作是结果等价的。
二、使用场景
前端重复提交数据,就是华为面试官问我的那个场景
订单支付请求:无论发生什么都应该只扣一次钱
下单、短信发送等等
总结就是,由于人为ie、系统、网络等因素导致的重复提交问题,都需要考虑接口幂等性。
三、应对策略
前端:接口响应返回之前只可点击一次,置灰、loding
token:进入页面时申请token,所有请求都带上这个token,删选重复token请求
token+redis:其实就是token的分布式缓存情况
分布式锁:进入方法前先获取锁
消息队列去重:将请求快速接收但是放进缓存做处理
session:session中存一个标识符,首次提交对比标识符并删除,如无标识符则重复提交。
唯一索引:防止数据重复插入
状态机:比如订单状态-待支付-支付中-支付成功-支付失败-超时关闭等多种状态,如果在更新时条件里有状态,多次调用实际也只会执行一次,因为重复调用时状态已经发生了变化
乐观锁:有点类似于状态机,但是用的不是状态控制,而是version控制,其实我感觉没有状态控制好,因为版本控制的话还需要获取版本,并且在条件中的版本信息设置为获取的版本,而状态控制有先验知识的情况下可能不需要获取状态
总结
消息队列去重和session的细节还需要进一步学习