自学内容网 自学内容网

如何实现接口幂等性?

概述

幂等,英文idempotent [aɪ'dempətənt]

幂等这个词源自数学,是数学中的一个概念,常见于抽象代数中,表达的是N次变换与1次变换的结果相同,在计算机的各个领域都借用了该概念

幂等函数或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数,简单来说就是如果方法调用一次和多次产生的效果是相同的,不会导致系统数据出错,那么它就具有幂等性;

幂等性衍生到我们系统中,它的语义是指函数/接口可以使用相同的参数重复执行,不应该影响系统状态,也不会对系统造成改变;

也就是任意多次执行所产生的影响均与一次执行所产生的影响相同;

场景

1、因网络波动,可能会引起重复请求;

2、用户重复操作,用户可能会无意的触发多次下单多次交易,甚至没有响应而有意触发多笔交易

3、应用使用了失败或超时重试机制(如RPC重试、业务层重试等)

4、第三方平台的接口(如:支付成功回调接口),因为异常导致多次回调;

5、中间件/应用服务根据自身的特性,也有可能进行重试

6、用户双击提交按钮;

7、用户页面重复刷新:

8、使用浏览器后退按钮重复之前的操作,导致重复提交表单:

9、使用浏览器历史记录重复提交表单:

10、浏览器重复的HTTP请求:

11、定时任务重复执行;

1. 什么是幂等性?

接口幂等性是指无论对同一个接口进行多少次相同的操作,最终的结果都是相同的。换句话说,即使对同一个接口发送多次相同的请求,也不会改变服务器的状态或产生额外的副作用。

举例1:

假设有一个用于创建用户的接口,当客户端发送一个POST请求到该接口时,会在服务器上创建一个新的用户。接口的幂等性意味着无论客户端发送多少次相同的请求,只会创建一个用户,并且重复的请求不会对服务器上已有的用户数据产生影响。

举例2:

银行转账接口。如果该接口是幂等的,同一个订单支付接口,无论客户端发送多少次相同的转账请求,最终账户的余额都只会被减去相同的金额,而不会重复扣款。

通过保持接口的幂等性,开发人员可以确保系统在出现网络故障、重试请求或处理并发请求时,都能保持一致的状态,避免产生重复数据或不一致的结果。

3.SQL的幂等性

SELECT * FROM USER WHER ID = 1;            // 无论执行多少次重复请求,都不会改变状态,是天然的幂等。
UPDATE USER SET STATE =  1 WHERE ID = 1;   // 无论执行多少次重复请求,都不会改变状态,也是幂等操作。
UPDATE USER SET AGE = AGE + 1 WHERE ID = 1;// 每次执行的结果都会发生变化,这种就不是幂等的。

SQL

4.RESTful API 接口的幂等性

5.为什么要保证幂等?

  1. 防止前端重复提交表单;

  2. 防止用户恶意发送请求;

  3. 防止接口超时重复提交;

  4. 防止消息出现重复消费。

6.如何保证幂等?

幂等,可以通过唯一的业务单号来保证。也就是说相同的业务单号,无论请求多少次认为是同一笔业务,相同的业务单号的处理逻辑和执行效果是一致的。

比如银行第三方支付,需要传递订单号,保证业务的唯一性

7.幂等方案(防重令牌)的原理

①. 服务端提供获取TOKEN的接口;

②. 客户端向服务端发起请求前,第一步先获取TOKEN,将该TOKEN存入REDIS后并将TOKEN返回给客户端;

③. 第二步,客户端在HEADER中携带该TOKEN向服务端发起业务请求;

④. 服务端接收请求从HEADER中解析TOKEN,并在REDIS中查找该TOKEN;

⑤. 如果TOKEN存在,则删掉该TOKEN,继续执行下面的业务操作;

⑥. 如果TOKEN不存在,说明第一次请求已将TOKEN删除,当前的请求并不是第一次请求,则返回重复操作的信息。


原文地址:https://blog.csdn.net/zhzjn/article/details/142419012

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!