当前位置: 首页 > 后端技术 > PHP

通过实际业务场景理解后端接口的幂等性

时间:2023-03-29 13:52:28 PHP

写在前面:之前因为经验不足,在设计接口的时候没有考虑太多幂等性,而是以前发生的一个线上问题这两天让我认识到了接口幂等性在某些情况下的重要性;非幂等场景:服务A通过RPC远程过程调用将文档A信息传递给下游服务B接口(非幂等接口)生成关联文档B,服务B接口会检查文档A是否被接收。如果已经收到,会报错“重复文件”。如果没有收到,则生产关联文档B写入数据库,并将结果返回给服务A,服务A接收结果。修改此文档的状态后,将结果返回给客户端。简化流程图如下:非幂等问题:服务A调用服务B后,服务B生成关联文档B写入数据库成功,返回成功给服务A;但是由于网络抖动,服务A没有收到服务B返回的Response,默认是接收失败,返回客户端失败;业务人员重试,但是因为服务B已经接受了这个单据A,所以会抛出“repeatdocumentA”的异常,而这个单据A永远无法接受单据B的Successful响应,一直处于“处理失败”的状态,与实际情况不符的;(出现此问题后,首先确认文档A的关联文档B已经生成,然后在服务A中手动修复文档A的状态为“处理成功”)powerEquality解决方案:为了解决以上问题,需要保证下游服务B的接口对文档A的维度是幂等的;判断再次收到单据A后,不做任何操作,直接返回成功,服务A收到成功后,可以将单据A的状态改为“处理成功”;接口的幂等性其实就是接口可以被重复调用。在调用方多次调用的情况下,接口的最终结果是一致的。有些接口天生就可以实现幂等性,比如查询接口。对于查询,你查询一次或两次,对系统没有影响;会对系统产生多方面的影响。实现幂等性的关键是识别重复请求,在不影响系统的情况下,对重复请求返回成功;实现幂等后的简化流程图:写在最后:实现幂等的应用场景也有很多,实现的方式也有很多,需要考虑的问题也很多。随着工作学习的深入,理解一定会越来越深,加油!