码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2021-05-24 07:56:12      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:rest   出现   幂等性   方案   creat   利用   除了   服务   函数   

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

幂等的数学概念

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

如果在一元运算中,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一起提交,同一个页面无论用户提交多少次,则就可以成功一次。

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

标签:rest   出现   幂等性   方案   creat   利用   除了   服务   函数   

原文地址:https://www.cnblogs.com/jianzihao/p/14764576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!