分布式幂等性设计

幂等性

幂等性指的是,请求一次或者是多次资源应该具有相同的副作用。

重要性

在一些业务场景下,幂等性显得很重要;比如金融系统、电商系统,这些都是很敏感的系统,作为软件开发者,我们有必要了解一下它。

  • 订单创建接口,第一次调用超时了,如果再调用一次会不会再创建一个订单?
  • 购买商品时,减库存接口超时了,再调一次会不会扣减2个库存?
  • 当一笔订单开始支付,支付请求发出后,服务端发生了扣钱操作,接口响应超时了,调用方再重试一次,会不会多扣一笔钱?

下面我们介绍一下怎么解决上面所述的问题。

设计

通常我们有两个方法来保证幂等性。也就是不管调用接口多少次,都要产生相同的副作用:

  • 下游做一个查询接口,上游系统发现请求超时后,调用查询接口。发现成功了,逻辑里面什么都不用做;如果发现失败了,走失败流程进行后续处理保证最终结果正确。
  • 把这个查询操作交给下游系统,上游系统只负责重试,下游系统要在代码上保证一次或多次请求结果是一样的.

第一种没什么好说的,很好实现;第二种则需要利用一个全局ID来辅助完成。由于我们的系统是一个分布式的,要做到全局唯一貌有点小难度,分布式中,子系统很多。该由谁来维护这个全局ID?这里介绍一下Twitter 的开源项目Snowflake。它是一个分布式ID的生成算法,可以帮我们完成这个工作,你可以通过阅读下面这个文章来交接它https://www.cnblogs.com/haoxinyue/p/5208136.html