SpringBoot如何实现接口幂等性操作?


SpringBoot如何实现接口幂等性操作?

文章插图
 
什么是接口的幂等性?
幂等作为一个数学概念 , 是指在某个一元运算过程中 , 任意次数的运算结果会与一次运算结束后的结果是相同的 。在计算机操作中 , 一个幂等操作的特点是任意执行一次或者多次其操作所产生的影响与执行一次操作产生的影响结果是一样的 。
而所谓的幂等函数或者是幂等方法 , 则是指如果使用相同的参数进行重复执行 , 执行一次与执行多次所产生的结果是一样的 。也就是说函数或者是方法的不会对整个系统的状态产生影响 , 也不用担心多次执行函数会对系统产生改变 。
接口幂等性则是指对于某个接口来讲 , 请求一次的效果与请求多次对系统本身的影响是一样的 , 也就是说第一次请求对系统产生了一定的影响 , 但是在后续请求过程中对系统产生的影响与第一次请求所产生的影响是一样的 , 不会对系统带来副作用 。
为什么需要幂等性操作?
一般我们向外提供的接口都是可以正常返回信息的 , 也就不会出现重复调用接口的情况 , 但是如果遇到了网络卡顿、页面卡顿等情况有可能会出现页面表单重复提交 , 网络卡顿有可能会出现接口超时 , 造成的接口重复调用 , 或者是会出现恶意攻击接口等情况 。
而如何接口采用了幂等性操作其最大的优势就是可以保证接口调用一次的效果与多次调用的效果是样的 , 可以有效的避免因为重复调用而带来的诸多系统未知错误 。
引入幂等性之后可以简化客户端的处理逻辑 , 也能有效的防止表单的重复提交 。但是引入幂等性所付出的代价就是后端处理逻辑会相对较复杂 。所以 , 在引入幂等性操作的时候首先需要考虑的就是是否有必要引入 , 要根据实际的情况 , 结合具体的业务来完成对幂等性的引入 。
如何所实现幂等性操作?
第一种、数据库唯一键约束
数据库的主键唯一性约束 , 一般比较适合对于插入操作的幂等性约束 , 因为我们知道 , 一张数据库表中的一条记录只能有一个唯一的主键来进行标识记录 。
使用数据库主键唯一性约束作为幂等条件的时候需要注意的是 , 在实际开发中我们所使用的主键并不是数据库中自增的主键 , 而是采用一些分布式的ID来充当组件 , 这样才能有效的保证在分布式环境下的ID全局唯一性 。这样就可以保证幂等性的操作了 。如下图所示 。
SpringBoot如何实现接口幂等性操作?

文章插图
 
主要流程包括
 
  1. 客户端执行创建请求 , 调用服务端接口
  2. 服务端执行业务逻辑采用分布式ID生成算法生成一个ID , 将对应的ID插入对应记录的主键 , 然后执行数据插入操作 。
  3. 服务端将对应的数据插入到数据库中 , 如果这个时候继续有同样的请求进入 , 则数据库就会报出主键冲突的异常 , 这个时候就可以提示客户度数据库中已存在该条信息 。请勿重复提交 。
 
第二种、数据乐观锁操作
数据库乐观锁操作是一种适用于更新操作的的幂等性解决方案 。其实现需要我们在数据库表中多加入一个字段来充当当前数据版本号的标识 。这样如果对这个数据进行更新的时候 , 就可以将该版本号作为标识来判断数据是否被更新了 。
update table set number1 = 123 where id= 1 and version = 5;
例如如果执行了上面这个操作之后 , 我们可以将id = 1 并且 version=5 的数据进行了更新 , 在更新成功之后 , version就会变成 6 , 那么如果这个时候还有请求进入其带入到更新操作依然会是version为5的操作 , 实际上 , 这个时候version已经变成了6 , 那么显然version为5的操作就是找不到的 , 就可以保证了更新操作的幂等性 。并且多次执行也不会对数据产生多余的影响 。


推荐阅读