什么是幂等性
幂等性最初是数学中的一个概念,这意味着第一次变换与 n 变换具有相同的效果。
幂等性:多次执行同一操作的结果与执行一次相同操作的结果相同。
设计幂等接口非常重要,尤其是在处理涉及资源状态更改的操作时。
1. 幂等性情景
1.前端重复提交
这就像有一个添加新产品的功能,有一个保存按钮,如果前端连续多次点击保存,后端就会收到多个对界面的请求,如果不是幂等的,就会重复创建多个记录,就会出现脏数据。
这就是我们所说的如何防止前端重复提交的问题。
2. 界面超时,重试
当我们调用第三方接口时,调用可能会因为网络等原因而失败,所以我们会在接口调用中加入失败重试机制,Spring可以通过@retryable注解来实现重试机制。
由于可以重试,因此可能会重复调用接口。 在这种情况下,如果再次调用时不执行幂等操作,则可能会出现脏数据。
3. 重复消息消费
这是不可避免的,因为我们说MQ既在生产端,又在消费者端重试机制,也就是说,相同的消息可能会被重复使用。
如果服务保证了多次消费的结果相同,那就没问题了,但如果服务不能满足要求,那么就需要在其他方面保证消费者端的幂等性。
2. 如何保证幂等性
以下是设计幂等接口的一些常见策略:
1.使用 http 方法:
使用 http 的幂等方法(如 get、put 和 delete)对资源执行操作。
避免使用非幂等方法,例如 POST,除非有明确的理由使用它,并且设计时考虑了幂等性。
2.提供唯一标识符:
确保每个资源都具有唯一的标识符,例如 ID 或密钥。
使用此唯一标识符作为请求的一部分,以便要准确操作的资源位于每个请求上。
3.检查资源状态:
在处理资源更改操作之前,请检查当前资源的状态。
如果已处于目标状态,则无需进行任何更改即可返回成功的响应。
4.忽略重复请求:
如果收到重复的请求,可以选择忽略它们,而不对资源进行任何更改。
您可以使用请求标识符、时间戳或其他标识符来检查请求的唯一性。
5.使用乐观并发控制:
在资源状态中包含版本号或时间戳,并在每次请求时将其包含在请求中。
在处理请求之前,请比较资源的版本号或时间戳,如果存在冲突,则返回冲突的响应。
6.提供幂等标识符:
对于非幂等操作,可以要求客户端提供幂等标识符。
在每个请求中,客户端提供相同的幂等标识符,以确保仅执行一次相同的操作。
7.日志请求和结果:
每个请求及其结果都记录在服务器端,以便在处理重复请求时进行检查和跟踪。
根据您的具体需求和业务逻辑选择正确的策略,以确保接口的幂等性。 在设计接口时,考虑数据的一致性和安全性也很重要。