目录
什么是接口的幂等性,如何保证接口的幂等性?
1.什么是幂等性
幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。在计算机中编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数或幂等方法是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。
2.什么是接口幂等性
所谓接口幂等性,就是一次和多次请求某一个资源对于资源本身应该具有同样的结果。
接口的 「幂等性(Idempotence)」 是指一个操作在执行一次和多次执行时,其结果是一样的
。换句话说,无论这个操作被执行多少次,它对系统状态的影响都是相同的。幂等性是分布式系统中的一个重要概念,它有助于确保系统的健壮性和一致性。
在网络通信和 API 设计中,幂等性尤为重要,因为它可以防止由于网络重传、客户端或服务器端的重复请求等问题导致的数据不一致。例如,一个幂等的 HTTP 请求(如 GET 或 PUT 请求)在多次发送时,服务器应该能够正确处理,确保不会对资源造成意外的影响。
3.应用场景
不知道以下场景,朋友们是否遇到过:
-
「前端重复提交表单:」 在填写一些表格时候,用户填写完成提交,很多时候会因网络波动没有及时对用户做出提交成功响应,致使用户认为没有成功提交,然后一直点提交按钮,这时就会发生重复提交表单请求。
-
「用户恶意进行刷单:」 例如在实现用户投票这种功能时,如果用户针对一个用户进行重复提交投票,这样会导致接口接收到用户重复提交的投票信息,这样会使投票结果与事实严重不符。
-
「接口超时重复提交:」 很多时候 HTTP 客户端工具都默认开启超时重试的机制,尤其是第三方调用接口时候,为了防止网络波动超时等造成的请求失败,都会添加重试机制,导致一个请求提交多次。
-
「消息进行重复消费:」 当使用 MQ 消息中间件时候,如果发生消息中间件出现错误未及时提交消费信息,导致发生重复消费。
没错,这些都是幂等性问题。
接口幂等性
是指用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
这类问题多发于接口的:
-
insert
操作,这种情况下多次请求,可能会产生重复数据。 -
update
操作,如果只是单纯的更新数据,比如:update user set status=1 where id=1
,是没有问题的。如果还有计算,比如:update user set status=status+1 where id=1
,这种情况下多次请求,可能会导致数据错误。
4.解决方案
4.1 inset之前先select
通常情况下,在保存数据的接口中,我们为了防止产生重复数据,一般会在insert
前,先根据name
字段select
一下数据。如果该数据已存在,则执行update
操作,如果不存在,才执行 insert
操作。
4.2 数据库唯一索引
大多数情况下,我们为了防止数据重复提交,我们都会在表中添加唯一索引,这个一个非常简单而且有奇效的方案。
alter table `order` add UNIQUE KEY `t_code` (`code`);
加了唯一索引之后,第一次请求数据可以插入成功。但后面的相同请求,插入数据时会报Duplicate entry '002' for key 'order.t_code
异常,表示唯一索引有冲突。
「具体流程图如下:」