写在前面:以前在设计接口时因经验尚浅,并未过多考虑幂等性,但这两天出现的一个线上问题让我认识到了某些状况下接口幂等性的重要性;网络
非幂等场景:
服务A将单据A信息经过RPC远程过程调用传给下游服务B接口(非幂等接口)用于生成关联单据B,服务B接口会校验是否已经接收过单据A,若是已接收过,会报错『重复的单据』,若是未接收过,则生产关联单据B并写库,将结果返回服务A,服务A收到结果后修改此单据状态,将结果返回客户端。简化流程图以下所示:学习
非幂等出现的问题:
服务A调用服务B后,服务B生成关联单据B写库成功,返回成功给服务A;但因为网络抖动,服务A未接收到服务B返回的响应,默认认定失败,返回客户端失败;业务人员重试,但因为服务B已接受过此单据A,会抛出异常『重复单据A』,对于此单据A就永远没法接受到单据B的成功响应,永远为『处理失败』状态,与实际状态不一致;(出现此问题后,首先确认单据A的关联单据B已生成,而后手动修复服务A里单据A的状态为『处理成功』)spa
幂等性解决:
为了解决以上问题,就须要保证下游服务B接口对单据A维度作幂等性;判断再次接受到单据A以后,不作任何操做,直接返回成功便可,服务A接受到成功后便可修改单据A状态为『处理成功』;设计
接口的幂等性实际上就是接口可重复调用,在调用方屡次调用的状况下,接口最终获得的结果是一致的。有些接口能够自然的实现幂等性,好比查询接口,对于查询来讲,你查询一次和两次,对于系统来讲,没有任何影响;但对于有写库操做的增删改接口,屡次调用就会对系统有屡次影响。接口
实现幂等性的关键在于识别重复的请求,对重复的请求返回成功便可,无需再对系统形成影响;图片
实现幂等性后的简化流程图:it
写在最后:幂等性应用的场景还有不少,实现也有不少方式,更有不少须要考虑的问题,随着工做学习的深刻,理解也必定会愈来愈深刻的,加油!class