很多同学都应该听过幂等这个概念,但如果在面试中真的被问起来什么是幂等,你有信心去解释清楚么?
首先看看幂等的定义。
一个HTTP方法是幂等的,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。在正确实现的条件下,GET,HEAD,PUT和DELETE 等方法都是幂等的,而 POST 方法不是。所有的 safe 方法也都是幂等的。
幂等性只与后端服务器的实际状态有关,而每一次请求接收到的状态码不一定相同。例如,第一次调用DELETE 方法有可能返回 200,但是后续的请求可能会返回404。DELETE 的言外之意是,开发者不应该使用DELETE方法实现具有删除最后条目功能的 RESTful API。
需要注意的是,服务器不一定会确保请求方法的幂等性,有些应用可能会错误地打破幂等性约束。
是不是有点抽象?
再看看英文的定义
Idempotence (UK: /??d?m?po?t?ns/,[1] US: /?a?d?m-/)[2] is the property of certain operations in mathematics and computer science whereby they can be applied multiple times without changing the result beyond the initial application. The concept of idempotence arises in a number of places in abstract algebra (in particular, in the theory of projectors and closure operators) and functional programming (in which it is connected to the property of referential transparency).
嗯,看上去问题更加复杂了。
其实幂等就是一个操作或者接口,不管你调多少次,每次执行的结果都跟第一次一样。
比如数学上,1这个数字就是幂等的,无论你用什么数字跟1乘,乘多少次,最后的结果都跟第一次是一样的。
试想这样的一种场景:在电商平台上支付后,因为网络原因导致系统提示你支付失败,于是你又重新付款了一次,等完成后检查网银发现被系统扣了两次款,这是一种什么样的体验?
造成上述问题的原因可能有很多,比如第一次付款时实际支付成功,但是信息返回时网络中断导致系统误判;又比如第一次付款的确失败了,但第二次付款时发生意外,导致支付请求被重复发送等等。在一次支付的过程中,每个环节都有可能会发生问题,我们要如何规避这类问题引发的分险?
幂等性是解决这类问题的方案之一,所以在电商,银行,互联网金融等对数据准确性要求很高的领域中,这一特性具有十分重要的地位。
所以对于一些重要的接口或者操作,我们是要求后台保证其幂等性的。因为客户端可能有重试机制,另外中间人攻击可能会进行请求的重放,这些都有可能导致接口被多次调用,像上面的扣款操作,如果接口没有实现幂等,那么后果是相当不堪设想的。
原文:https://www.cnblogs.com/xiyuan2016/p/14347974.html