分布式系统中的幂等性问题

Posted 简直

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式系统中的幂等性问题相关的知识,希望对你有一定的参考价值。

在实际的业务开发中遇到过由于无幂等性,造成脏数据的情况,阅读过系统中别人写的请求去重部分的逻辑,深感在开发过程中保证接口幂等性的重要,由此总结接口幂等的内容。

幂等的数学概念

幂等是源于一种数学概念。其主要有两个定义

如果在一元运算中,x 为某集合中的任意数,如果满足 f(x) = f(f(x)) ,那么该 f 运算具有幂等性,比如绝对值运算 abs(a) = abs(abs(a)) 就是幂等性函数。

幂等性在开发中的概念

对于同一个请求和多次重复请求对资源的影响是一致的,在分布式系统下的RPC或者Restful 接口相互调用的情况下,很容易出现由于网络错误等各种原因导致调用的时候出现异常

  • 对文章的点赞,一个用户对一个文章只能点一次
  • 支付时只能扣一次钱
  • 创建订单时,无论点击多少次就一个

幂等性与并发安全

幂等性与并发安全是俩个完全独立的问题,同一笔订单不停的提交支付,扣除了多次钱,说明接口不幂等,但是,同时有多笔订单进行支付,最后扣除的金额不是预期的金额,则并发不安全。

HTTP与幂等性

即所谓的crud中,天然需要幂等的应该是update,create,则提出的方案,在update时可根据防重表、状态标识进行判断,create时要根据token进行处理

实现幂等性的方案

去重表

利用数据库的特性实现幂等,在表上构建唯一索引,只要一个数据构建完毕,后面再次操作无法完成。 eg:点赞之后用户id,博文id后续用户点赞同一个博文就无法插入;在金融系统中,用户创建金融账户,一个用户只能有一个账户,在账户表中添加唯一索引存储用户id,重复创建时只能拥有一个账户。

状态标识

通过表中状态标识的变更,保证业务中每个流程只会在对应的状态下执行,在执行订单支付时,通过判断订单中的是否支付状态来进行更新,若已支付,则不会更新金额

Token机制

核心是每次操作都生成一个唯一token凭证,服务器通过唯一凭证保证同样的操作不会被执行俩次,即所谓的请求去重,比如要在订单提交时生成token则每次都不一样,无意义,应该在进入编辑页面时生成token,带着token一起提交,同一个页面无论用户提交多少次,则就可以成功一次。

以上是关于分布式系统中的幂等性问题的主要内容,如果未能解决你的问题,请参考以下文章

分布式架构中的幂等性

分布式接口的幂等性设计

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

我们一起来谈谈高并发和分布式系统的幂等如何处理!

分布式高并发系统如何保证对外接口的幂等性?

幂等和高并发在电商系统中的使用