美文网首页
「解决方案」幂等并发重复提交探究

「解决方案」幂等并发重复提交探究

作者: Chinesszz | 来源:发表于2020-01-01 11:55 被阅读0次
在这里插入图片描述

一款专门为SpringBoot设计的防重幂等组件

本文以下的讨论,都是假设我们数据库没有做唯一约束和乐观锁的场景下的分析。关于防重和幂等判断的讨论,欢迎留言讨论,感谢关注大佬支持。


一、问题重现

下面这段逻辑,在正常情况下是没有问题的,①也算进行了幂等校验,先判断状态在进行处理。但是当用户重复提交导致并发问题,两次请求都执行到了④步骤,而因为④并没有用乐观锁处理,就会导致幂等性问题。两次提交都对数据状态进行的修改。


在这里插入图片描述

所以我们得出结论凡是通过根据查询状态来做防重或者幂等校验的,理论情况下都会因为并发问题而被击穿。 所以如果数据库表设计允许的情况下,建议设置唯一约束,用来做幂等或者防重。(sql尽量加上乐观锁操作)

二、如何防止重复提交?

方案 1: 幂等表

利用数据库唯一索引做防重处理,当第一次插入是没有问题的,第二次在进行插入会因为唯一索引报错。从而达到拦截的目的。

方案 2: token令牌

如何防止重复提交, 为每次请求生成请求唯一键,服务端对每个唯一键进行生命周期管控。规定时间内只允许一次请求,非第一次请求都属于重复提交。但是前后端改造大,后端要给出单独生成token令牌接口,前端要在每次调用时候先获取token令牌。

方案 3: 基于方法粒度指定唯一键【Tomato】

基于Web方法,从参数中寻找可以作为唯一键,进行控制。改造难度低,仅需要服务端改造,前端无感知。

本文是基于方案 3提供的解决方案,具体实现是利用 Redis进行实现。

三、具体实现原理

原理非常简单,我们为每次请求声明一个防重的时间范围,范围内的重复请求都会当做重复提交被拦截。核心原理就是这么简单。


在这里插入图片描述

基于控制时间两种防重策略

策略一: 滑动窗口策略

每次请求设置当前请求的控制时间,控制时间内请求均会被拦截。

在这里插入图片描述

策略二: 固定窗口策略

仅仅为第一次请求生成一个控制时间,控制时间内相同的请求会被拦截,控制时间过期后,以此类推。


在这里插入图片描述

四、代码演示

1.利用拦截器实现

//防重范围时间1000
@Repeat(scope = 1000)
public VoidResponse addWhite0(@TomatoToken("name") String name) {
        return VoidResponse.SUCCESS();
}

//如果是基本类型就直接用,如果是对象模式就从对象里面去取。
@Repeat(scope = 1000)
public VoidResponse addWhite1(@TomatoToken("${name}") TestDataRequest name) {
        return VoidResponse.SUCCESS();
}

//从表单中获取
@Repeat(scope = 1000)
public VoidResponse addWhite2(@TomatoTokenFrom("name")HttpServletRequest request) {
        return VoidResponse.SUCCESS();
}

2.硬编码实现

public VoidResponse addWhite(String name) {
            Idempotent.idempotent(name,1000,()->new RuntimeException("重复提交"))
        return VoidResponse.SUCCESS();
}
image
感谢您的阅读,本文由 程序猿升级课 版权所有。如若转载,请注明出处:程序猿升级课(https://blog.springlearn.cn/

相关文章

  • 「解决方案」幂等并发重复提交探究

    一款专门为SpringBoot设计的防重幂等组件 本文以下的讨论,都是假设我们数据库没有做唯一约束和乐观锁的场景下...

  • 高并发下的接口幂等性解决方案

    高并发下的接口幂等性解决方案 1.token机制,防止页面重复提交 流程如下: 1.发送方记录token(GUID...

  • 接口幂等性

    接口幂等性 什么是接口幂等性? 最简单想到的实现接口幂等性(重复提交)的操作是什么? 最简单稍靠谱的解决方案是什么?

  • 【工作篇】接口幂等问题探究

    【工作篇】接口幂等问题探究 前言 最近遇到一些问题,表单重复提交,导致插入重复数据到数据库,这里查询一些通用的方案...

  • 接口幂等性(重复提交)

    幂等接口就是多次调用不会影响到系统。 数据库唯一主键 数据库唯一主键的实现主要是利用数据库中主键唯一约束的特性,一...

  • SpringCloud 幂等性分布式解决方案

    幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数 研究了很久的幂等性解决方案。终于实现了...

  • 【转载】高并发下接口幂等性解决方案

    高并发下接口幂等性解决方案 一、幂等性概念在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影...

  • 幂等设计

    为什么要做幂等? 幂等就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的。 例如 1、 前端重复提交选...

  • 幂等系统设计

    1.系统为什么需要幂等 前端用户的操作问题导致表单重复提交,不做幂等控制会导致创建多个记录,例如用户下单,可能会导...

  • 分布式锁:高并发下的幂等问题的"答案"

    写在前面:本文讨论的幂等问题,均为并发场景下的幂等问题。即系统本存在幂等设计,但是在并发场景下失效了。 一 摘要 ...

网友评论

      本文标题:「解决方案」幂等并发重复提交探究

      本文链接:https://www.haomeiwen.com/subject/pciwoctx.html