现如今我们的系统大多拆分为分布式SOA,或者微服务,一套系统中包含了多个子系统服务,而一个子系统服务往往会去调用另一个服务,而服务调用服务无非就是使用RPC通信或者restful,既然是通信,那么就有可能再服务器处理完毕后返回结果的时候挂掉,这个时候用户端发现很久没有反应,那么就会多次点击按钮,这样请求有多次,那么处理数据的结果是否要统一呢?那是肯定的!尤其再支付场景。幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品使用约支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条。在一个典型的订单交易系统中,防重和幂等设计是重要而又非常基本的概念。防重是指重复多次提交同样的交易指令或者订单请求到后台,系统必须能够去重,防止重复执行;而幂等,则是在多个同样的交易指令或请求同时或者先后到达后台,即使重复执行,系统也必须始终提供与一致的状态,而不能有其他的副作用。看起来,防重与幂等似乎在说同一件事情,但其实又有不同的概念区分。例如幂等其实可以通过防重设计来达到提供一致的系统状态,而防重却不如幂等那样开放承诺,允许被执行多次而达到一致状态,这其实要求在防重的基础上做出更多的设计工作,特别是在分布式环境中。
一、幂等定义幂等是数据中得一个概念,表示N次变换和1次变换的结果相同。为了更深入地理解幂等,我们先来看看HTTP/1.1协议中对幂等性的定义