重复操作不重复增加约定效果
把某个配置设为指定值,与把计数器再加一,具有不同的重复语义:前者可以在相同前提下重复得到同一目标状态,后者通常每次都增加一次。判断幂等需要先说明操作想产生的效果,而不能只看请求内容是否相同。
HTTP规范把幂等定义为多次相同请求与一次请求具有相同的预期服务端效果。PUT、DELETE及安全方法属于该规范规定的幂等方法,但这不意味着它们在所有时候都成功,也不要求重复请求返回同一个状态码。
参考:[1]
重试需要表达同一次意图
通信中断可能发生在服务已经完成操作、调用者却未取得响应之后。若必须避免重复创建资源,接口可以让调用者提供请求标识,由服务端把相同调用者的同一标识识别为重试,而不是当作另一次独立意图。
Amazon的幂等API说明强调,记录标识与相应修改需要共同满足原子处理条件;否则可能只记住标识却没创建资源,或已经创建却没记住标识。一个去重键不是正确性的全部,关联状态也要一致地保存。
参考:[2]
幂等不等于所有痕迹相同
HTTP的幂等约束针对用户请求的效果,服务器仍可以为每次请求单独记录日志或修订历史。由此可见,重复调用减少额外业务影响,与后台完全不再执行工作,是不同的承诺。
安全重试还要结合资源语义与接口范围。HTTP规范不允许客户端仅凭请求失败,就自动认定非幂等操作可以重发;服务端提供的具体幂等约定,或者原请求尚未生效的可靠证据,才是进一步判断的依据。