接口幂等性是指对同一操作发起的一次或多次请求结果是一致的,并且不会因为重复请求而产生副作用。
例如前端应用对后端发出请求,可能由于网络原因,前端并未接收到后端响应,前端进行重试,对后端同一接口发出多次请求
假如我们业务代码如下:
//查询1号员工数据
Employee employee = employeeService.selectById(1);
//更新工资
employee.setSalary(employee.getSalary() + incrSalary);
//执行更新语句
employeeService.update(employee)
那么发一次请求就会执行一次update,业务规则就被破坏了!
为了避免这种情况发生,以下是实现接口幂等性的一些方法:
使用唯一事务标识:为每次请求分配唯一的事务ID,服务端根据这个ID判断是否已经处理过该请求,确保操作只被执行一次。请求的时候在请求头增加唯一的请求流水号,后端在做操作之前首先查redis是否有操作成功的数据,有则不做update操作,没有则执行逻辑代码
状态检查:在执行操作前检查系统状态,如果发现操作已经执行过,则不再重复执行,第一次做修改的时候加上修改时间修改为当前时间,下次请求查询的时候加上查询条件只查询修改时间大于三个月时间的员工。
乐观锁或悲观锁:在数据库操作中使用锁机制,防止并发操作导致的数据不一致问题。
》》》 悲观锁
》》》乐观锁
结果验证:在客户端进行结果验证,如果发现结果与预期不符,可以重新发送请求。
限制重试次数:对于可能因为网络等原因需要重试的操作,限制重试的次数和时间间隔,避免无限制的重试导致的问题。
需要注意的是,幂等性并不是所有接口都需要具备的特性,它通常适用于那些可能会因为网络问题或其他原因而被重复调用的接口,如支付、订单提交等关键操作。对于那些不需要保证幂等性的接口,比如更新用户信息等,通常不需要特别设计幂等性处理机制。