幂等性的理解
从RESTful服务的角度来说,如果一个操作或者服务调用是幂等性的,那么客户端以相同的方式重复调用服务就应该产生相同的结果。换句话说,发出多个请求和发出一个请求应该具有相同的效果。需要注意的是,虽然幂等性操作会在服务端产生相同的结果(没有副作用),但是操作的response响应本身可能并不相同(比如资源的状态会在不同请求之间发生变化)。
不同场景下的体现
在增删改查四个操作中,查询对于结果是不会改变的,删除只会进行一次,但是多次删除服务端的状态是相同的,但是返回可以不同,DELETE操作成功通常会返回200(OK)或204(No Content),但后续相同的DELETE操作可能会返回404(Not Found),除非服务被配置成只标记资源的删除状态而不是真正地删除资源。但是,当服务实际上已删除指定资源时,后续DELETE调用就会找不到该资源,并返回404。增加在重复提交的情况下会出现。
为什么要设计幂等性的服务
幂等可以使得客户端逻辑处理变得简单,但是却以服务逻辑变得复杂为代价。满足幂等服务的需要在逻辑中至少包含两点:
1.首先去查询上一次的执行状态,如果没有则认为是第一次请求
2.在服务改变状态的业务逻辑前,保证防重复提交的逻辑
幂等性的不足
幂等是为了简化客户端逻辑处理,却增加了服务提供者的逻辑和成本,是否有必要,需要根据具体场景具体分析,因此除了业务上的特殊要求外,尽量不提供幂等的接口。
1.增加了额外控制幂等的业务逻辑,复杂化了业务功能;
2.把并行执行的功能改为串行执行,降低了执行效率。
保证幂等性的策略
幂等需要通过唯一的业务单号来保证。也就是说相同的业务单号,认为是同一笔业务。使用这个唯一的业务单号来确保,后面多次的相同的业务单号的处理逻辑和执行效果是一致的。
下面以支付为例,在不考虑并发的情况下,实现幂等很简单:
①先查询一下订单是否已经支付过,
②如果已经支付过,则返回支付成功;如果没有支付,进行支付流程,修改订单状态为‘已支付’。