加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

幂等性如何保证的

发布时间:2021-04-18 15:13:04 所属栏目:外闻 来源:互联网
导读:念来自数学,表示对数据源做N次变换和1次变换的结果是相同的。在工程中幂等性用来表示用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。 幂等包括第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会

念来自数学,表示对数据源做N次变换和1次变换的结果是相同的。在工程中幂等性用来表示用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。

  • 幂等包括第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。
  • 幂等关注的是以后的多次请求是否对资源产生的副作用,而不关注结果。
  • 网络超时等问题,不是幂等的讨论范围。
  • 幂等性是系统服务对外一种承诺,而不是实现,承诺只要调用接口成功,外部多次调用对系统的影响是一致的。声明为幂等的服务会认为外部调用失败是常态,并且失败之后必然会有重试。

1.2 场景

业务开发时,可能会遇到由于网络震荡导致请求无法收到导致触发了重试机制,或者前端抖动导致表单重复提交这样的情况。比如在交易系统中,用户提交购物请求已经被服务器端正确处理,但服务器端的返回结果由于网络等原因被掉丢了,导致客户端无法得知处理结果。如果是在网页上,一些不恰当的设计可能会使用户认为上一次操作失败了,然后刷新页面,这就导致了扣款被调用两次,账户也被多扣了一次钱。此时就需要引入幂等性接口了。

我们以MySQL为例,只有第三种场景需要开发人员使用其他策略保证幂等性:

里说下重复提交跟幂等性的区别:

  1. 重复提交是在第一次请求已经成功的情况下,人为的进行多次操作,导致不满足幂等要求的服务多次改变状态。
  2. 幂等更多使用的情况是第一次请求不知道结果(比如超时)或者失败的异常情况下,发起多次请求,目的是多次确认第一次请求成功,却不会因多次请求而出现多次的状态变化。

1.3 幂等性思考

引入幂等性后会使得服务端逻辑更加复杂,满足幂等性的服务需要在逻辑中至少包含两点:

首先去查询上一次的执行状态,如果没有则认为是第一次请求。

在服务改变状态的业务逻辑前,保证防重复提交的逻辑。

幂等性可以简化客户端逻辑处理,但却增加了服务提供者的逻辑和成本,所以是否要用,需根据具体场景具体分析,因此除了业务上的特殊要求外,尽量不提供幂等的接口。

增加了额外控制幂等的业务逻辑,复杂化了业务功能。

把并行执行的功能改为串行执行,降低了执行效率。

2 幂等性解决

2.1 前端设置

在用户点击完提交按钮后,我们可以把按钮设置为不可用或者隐藏

比较简单,但有个致命错误,如果碰到懂行的用户通过模拟网页请求来重复提交请求,绕过了前端限制。

2.2 唯一索引

防止订单多次插入的最简单直接方法就是创建唯一索引,然后插入的时候可能语句有细微的不同。但目的都是保证相同记录在数据库中只存在一条。

  1. 方法一:给数据库添加唯一索引,然后如果执行时捕捉到了DuplicateKeyException会明白是重复插入导致的,继续往下执行业务即可。
  2. 方法二:利用MySQL自带的关键字ON DUPLICATE KEY UPDATE 实现不存在则插入,存在则更新的操作,该关键字不会删除原有的记录。
  3. 方法三:replace into 主要作用类似 INSERT 插入操作,replace into底层是先删除后插入数据,会破坏索引、重新维护索引。需注意必须要有主键或唯一索引才能有效,否则replace into就只新增了。

2.3 去重表

去重表的机制是根据mysql唯一索引的特性来的,大致流程:

  1. 客户端先请求服务端,服务端先将这次的请求信息存入一张mysql的去重表中,这张表要根据这次请求的其中某个特殊字段建立唯一索引,或者主键索引。
  2. 判断是否插入成功,如果插入成功,则继续做后续业务请求

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读