MicleMing.github.io

Blog: https://micleming.github.io/

View My GitHub Profile

幂等性

什么是幂等性

在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 在http1.1对于幂等性的定义如下:

Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.

所以,也就是说幂等性是在客户端发送多个请求和发一个请求具有相同的副作用。假设多一个请求组成了一个请求序列,这个请求序列执行多次所获得的结果是一样的,那么这个请求序列也可以说是幂等的。但是即使这个请求序列里的每一个请求都是幂等的,这个请求序列也可能不具有幂等性。比如这个请求序列返回一个结果,这个结果依赖于某个值,但是在下次相同的请求序列中,这个被结果依赖的值却被修改了。

为什么需要幂等性

设想这么一个场景,如果你在网上下了一个订单,但是由于网络原因,在客户端点击下单后,服务器端返回的结果没有及时反馈到客户端,那么就有可能出现重复点击下单的操作,如果这个操作的接口如果不具有幂等性,变有可能出现多个订单。所以这种情况下需要设计一个具有幂等性的接口,比如:

interface int createOrder
interface boolean idempotenceOrder

通过创建一个订单的ID来关联一个订单,避免重复创建新的订单。

http中的幂等性

在http中,GET, PUT,HEAD,DELETE都具有幂等性, 对于OPTION,TRACE是没有副作用的,那么这个方法也是具有幂等性。