分布式服务接口的幂等性如何设计

  

 

  假如你有个服务提供一个接口,结果这个服务部署在了5台机器上,接着有个接口就是付款接口。前端

  而后用户在前端上操做的时候,不知道为啥,总之就是一个订单不当心发起了两次支付请求,而后这俩请求分散在了这个服务部署的不一样的机器上,结果形成一个订单扣款扣两次。mysql

 

  所谓幂等性,就是说一个接口,屡次发起同一个请求,你这个接口得保证结果是准确的,好比不能多扣款,不能多插入一条数据,不能将统计值多加了1。。面试

 

 

保证幂等性主要是三点:redis

  对于每一个请求必须有一个惟一的标识,好比:订单支付请求,确定得包含订单id,一个订单id最多支付一次。sql

  每次处理完请求以后,必须有一个记录标识这个请求处理过了,好比说常见的方案是在mysql中记录个状态啥的,好比支付以前记录一条这个订单的支付流水,并且支付流水采spa

  每次接收请求须要进行判断以前是否处理过的逻辑处理,好比说,若是有一个订单已经支付了,就已经有了一条支付流水,那么若是重复发送这个请求,则此时先插入支付流水,orderId已经存在了,惟一键约束生效,报错插入不进去的。而后你就不用再扣款了。3d

 

  还有一种方法,好比说redis用orderId做为惟一键。只有成功插入这个支付流水,才能够执行实际的支付扣款。blog

 

 转自:中华石杉Java工程师面试突击接口

相关文章
相关标签/搜索