分布式服务接口的幂等性如何设计
假如你有个服务提供一个接口,结果这个服务部署在了5台机器上,接着有个接口就是付款接口。
然后用户在前端上操作的时候,不知道为啥,总之就是一个订单不小心发起了两次支付请求,然后这俩请求分散在了这个服务部署的不同的机器上,结果造成一个订单扣款扣两次。
所谓幂等性,就是说一个接口,多次发起同一个请求,你这个接口得保证结果是准确的,比如不能多扣款,不能多插入一条数据,不能将统计值多加了1。。
保证幂等性主要是三点:
对于每个请求必须有一个唯一的标识,比如:订单支付请求,肯定得包含订单id,一个订单id最多支付一次。
每次处理完请求之后,必须有一个记录标识这个请求处理过了,比如说常见的方案是在mysql中记录个状态啥的,比如支付之前记录一条这个订单的支付流水,而且支付流水采
每次接收请求需要进行判断之前是否处理过的逻辑处理,比如说,如果有一个订单已经支付了,就已经有了一条支付流水,那么如果重复发送这个请求,则此时先插入支付流水,orderId已经存在了,唯一键约束生效,报错插入不进去的。然后你就不用再扣款了。
还有一种方法,比如说redis用orderId作为唯一键。只有成功插入这个支付流水,才可以执行实际的支付扣款。
转自:中华石杉Java工程师面试突击