方法幂等性控制

方法幂等性控制

 

  1. 幂等

    HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同

    幂等不仅仅只是一次(或多次)请求对资源没有副作用(比如查询数据库操作,没有增删改,因此没有对数据库有任何影响)。
    ​
    幂等还包括第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。
    ​
    幂等关注的是以后的多次请求是否对资源产生的副作用,而不关注结果。
    ​
    网络超时等问题,不是幂等的讨论范围。

     

  2. HTTP方法

    HTTP GET           获取资源,支持幂等
    HTTP POST           新增    
    HTTP PUT            更新  (固定值:幂等,
                        更新变量增加值:update version=version+1,不支持幂等)
    HTTP DELETE        删除,幂等

     

  3. 保证幂等性的核心:

    1)对于每个请求必须有一个唯一的标识。

    2)每次处理完请求之后,必须有一个记录标识这个请求处理过了。

    3)每次接收请求需要进行判断之前是否处理过的逻辑处理。

     

  4. 常见解决方案

    1)业务表内唯一索引

    如果要对创建销售出库单的接口保证幂等性,也就是说网络超时,重复调用的时候,保证一个订单只能有一个对应的销售出库单。针对销售出库单的表的订单id,创建一个唯一索引,你如果接口被重试,同一个订单创建一个销售出库单的话,一定会违反唯一索引,那么此时数据库会报错。

    2)业务表内状态机

    修改订单状态,比如说将订单状态修改为待发货的时候,update order set status = “待发货” where status = “待付款” and id = 1,订单的状态其实就变为了“待发货”。假如说id = 1的订单接口重复调用,又要执行一次这个操作的话就不会生效。通常会去判断一下的,当前是否处于某个状态,然后才能流转到下一个状态。 (状态为待付款的才能流转到待发货)

    3)基于版本号的更新

    id name age version
    1 lisi 33 1

    如果要调用这个接口,更新他的这个年龄,先得查一下他的版本号是多少。然后传递参数进行操作。先查询在更新

    在接口里保证分布式接口的幂等性:

    update user set age=21, version=version+1 where id=1 and version=1

    4)新建操作记录表

    请求时生成唯一参数idNo,如果操作成功,往记录表中插入一条记录,第二次请求的时候根据唯一参数查询数据库是否存在,如果存在则不操作。

     

你可能感兴趣的:(java基础,java,spring,boot,后端)