问题:订单服务在通过feign调用库存服务进行库存扣减的时候,我们知道feign是有超时重试机制的。当出现feign超时,或者网络抖动的时候,订单服务以为上次调用没有成功,即使实际上调用成功了,还是会再次调用。库存服务无法区分是否为同一个操作,导致 相同操作被执行多次,造成多次扣减库存。
解决方案:调用库存服务前,先在redis生成一个操作标识。库存服务真正扣减库存前删除redis中的操作标识,如果删除成功,继续执行,否则直接返回。
- 分布式系统中,并发请求下保证安全的扣减库存,使用zk分布式锁。
- 服务间超时重复调用,使用操作标识保证幂等。zk锁是不能区分是否同一个请求的