如何实现接口幂等性?
概述
幂等,英文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.为什么要保证幂等?
-
防止前端重复提交表单;
-
防止用户恶意发送请求;
-
防止接口超时重复提交;
-
防止消息出现重复消费。
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)!