接口的幂等性

为什么要保证接口幂等性

由于网络延迟、超时、重试等因素,可能会导致客户端多次发送相同的请求。

通过保证接口的幂等性,无论客户端发送多少次相同的请求,服务器端都会保持相同的状态变化,从而确保系统的稳定性和数据的一致性。

幂等性和防止重复提交的接口不同

幂等性接口的标志:能够识别相同的请求,返回相同的结果

接口幂等性的应用场景

前后端通信

在前后端通信中,幂等性确保了用户界面(前端)对后端服务的请求在网络延迟或用户重复点击时不会导致不期望的副作用。例如,如果用户因为网络延迟而多次点击"提交订单"按钮,幂等性设计的后端服务可以保证不会重复创建订单。

应用场景:

表单提交:避免因用户多次点击而重复处理。

页面刷新:确保刷新操作不会重新提交数据。

数据更新:更新操作(如使用PUT或DELETE HTTP方法)可以安全地重试。

后端服务之间的通信

在微服务架构或分布式系统中,服务之间的调用可能面临网络问题或其他服务的故障进行重发。幂等性确保一个服务对另一个服务的调用(即使在多次尝试后)应保持一致的结果。

应用场景:

微服务调用:服务对其他服务的调用在遇到失败和需要重试时,保持操作的一致性。

消息传递:在基于消息的架构中,确保处理消息的过程是幂等的,即多次处理同一消息不会导致不一致的数据状态。

数据库操作:在复杂的事务处理中,确保跨多个数据库或表的操作可以安全地重试。

支付系统:确保支付指令不会因为重复处理而导致多次扣费。

订单系统:订单的创建和修改操作在系统间传递时,需要保证重复的请求不会导致数据错误或逻辑错误。

消息队列的重复请求

实现接口幂等性的方法

使用Token机制+redis确认是否重复请求,缓存处理结果返回

客户端生成Token:客户端生成一个唯一的Token,并将它随请求发送给服务器。服务器使用redis存储token,服务器根据Token来判断请求是否已经被处理。

服务器生成Token:在需要执行操作前,客户端先向服务器请求一个Token,服务器使用redis存储token,然后再用这个Token来执行操作。服务器通过验证Token的一次性来保证操作的幂等性。

优化HTTP方法,使其符合幂等性的特性:

某些HTTP方法(GET, PUT, DELETE)本身就是幂等的。例如,PUT方法用于更新资源,无论执行多少次,结果都应该确保资源状态相同。

csharp 复制代码
function updateUserPartially(id, email) {
    const url = `http://example.com/api/users/${id}`;
    const data = {
        email: email
    };

    fetch(url, {
        method: 'PATCH', // 指定请求方法为PATCH
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify(data) // 将JavaScript对象转换为JSON字符串
    })
    .then(response => response.json())
    .then(data => console.log('Success:', data))
    .catch((error) => console.error('Error:', error));
}
csharp 复制代码
function updateUser(id, email) {
    const url = `http://example.com/api/users/${id}`;
    const data = {
        email: email
    };

    fetch(url, {
        method: 'PUT', // 指定请求方法为PUT
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify(data) // 将JavaScript对象转换为JSON字符串
    })
    .then(response => response.json())
    .then(data => console.log('Success:', data))
    .catch((error) => console.error('Error:', error));
}
数据库约束:

利用数据库的唯一索引等约束来防止重复记录的插入,从而保证操作的幂等性。

逻辑设计

设计API时就考虑到幂等性,确保重试、重复请求或并发操作不会导致数据错误或状态不一致。

单独锁并不能保证幂等性,只能用来解决并发问题,即使是使用乐观锁+version,也只能识别出重复请求,而无法返回相同的结果,需要缓存结果
相关推荐
Abladol-aj14 分钟前
并发和并行的基础知识
java·linux·windows
清水白石00814 分钟前
从一个“支付状态不一致“的bug,看大型分布式系统的“隐藏杀机“
java·数据库·bug
qq_3643717214 分钟前
Vue 内置组件 keep-alive 中 LRU 缓存淘汰策略和实现
前端·vue.js·缓存
Python私教5 小时前
model中能定义字段声明不存储到数据库吗
数据库·oracle
吾日三省吾码6 小时前
JVM 性能调优
java
弗拉唐7 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi777 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
BestandW1shEs7 小时前
谈谈Mysql的常见基础问题
数据库·mysql
重生之Java开发工程师7 小时前
MySQL中的CAST类型转换函数
数据库·sql·mysql