Java学习五分钟系列,目的是为让大家在短时间内搞清楚一项技术的概念、优缺点和适用场景,想要深入的了解,还需要投入更多的时间。
什么是接口的幂等性
首先来看看什么是幂等性:用户对同一操作请求了一次或者多次,最终的结果是一致的,并不会因为多次请求产生副作用。
比如客户在网页上购买商品后付款的时候,点击了付款,支付成功已经扣款,但是由于网络的原因导致扣款成功的提示没有显示在页面上。这时候客户认为付款失败,于是又点击了付款,结果第二次付款也成功了。那么这样就是有问题的。
分布式系统接口幂等
所有的接口操作,不外乎就是增删查改。
- 查询操作,天然的具有幂等性,查询一次和查询多次,并不会对数据和查询结果产生影响;
- 删除也具有幂等性,只不过第一次删除成功后,后面的操作会找不到数据;
- 更新操作分为两种情况:情况一,把数据更新成新的值,之中情况更新多次并没有什么影响;但是如果更新操作是根据现在的值进行计算,得到的结果后更新,这时候就会有问题,例如例子中的扣款,就是在原有的基础上做减法;
- 插入是会有幂等影响的,多次插入会产生多余的数据。
如何保证接口的幂等性
方案一,每一次的请求,都有一个全局唯一的请求ID,这个请求ID只要执行过一次就失效了:
- 获得请求ID。
- 调用接口,同时传递请求ID。
- 交易前判断请求ID是否存在,如果存在直接返回结果;如果不存在,则执行交易后返回结果,同时记录请求ID。
方案二,数据中增加版本号的概念,那么在做数据修改,把当前数据的版本号带上,修改的时候要按照版本号判断数据是否发生过更改。如果没有发生过更改,则执行业务操作,并更新版本号。翻译成伪代码就是:
if(数据version == 请求传过来的version){
执行业务操作();
version = version + 1;
}else{
提示执行失败();
}
接口的重复调用,可能会产生不可预测的问题,一定要避免。