分布式系统中的幂等性问题
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一起提交,同一个页面无论用户提交多少次,则就可以成功一次。
以上是关于分布式系统中的幂等性问题的主要内容,如果未能解决你的问题,请参考以下文章