首页 > 其他分享 >项目中如何保证API接口的幂等性?有哪些实现解决方法?有何利弊

项目中如何保证API接口的幂等性?有哪些实现解决方法?有何利弊

时间:2024-02-02 16:00:13浏览次数:21  
标签:API 请求 重复 有何 接口 重刷 利弊 操作

在实际开发项目中保证API接口的幂等性是十分重要的,因为在幂等性可以保证多次相同的操作不会对系统造成多次影响。

首先来了解什么是接口API幂等性,简单来说就是对同一个接口的多次请求或操作造成的影响是相同的,就是说一个操作如果在其执行一次或者多次后产生的结果相同,这个操作就是幂等的。
幂等性用于保证用户的多次操作发起的请求获得的结果的一致性,不会产生任何其他的副作用,一个拥有幂等性的系统中,无论请求被执行一次或者多次,其结果都是相同的,从而确保系统的可靠性和正确性。


如何实现幂等性呢,一般有5种方法:

1. 数据库事务:通过数据库事务的特点,在执行某个操作之前开启一个事务,在完成操作后再提交事务,这样可以确保操作只执行一次,这样就可以保证API接口的幂等性。而且在分布式系统中也可以实现,
缺点:这样方法需要数据库支持事务,而且需要考虑数据库的隔离级别和系统并发性能。

2. 请求参数:通过在请求中添加唯一标识,例如时间戳,随机数等,确保每一次请求都是唯一的,从而实现幂等性,
缺点:如果唯一标识被篡改或者重复使用,会导致重复操作。

3. 分布式锁:通过分布式锁来保证API接口的幂等性,在执行某个操作时,先获取一个分布式锁,在完成操作后再释放该锁,这样就能确保同一时间只有一个节点可以执行该操作,从而避免重复操作,
缺点:分布式锁的实现较为复杂,需要考虑分布式系统的协调性和一致性。

4. JVM锁实现:通过JVM内置锁来实现幂等性,如Look或者是synchronized来实现,具体来说就是,在执行一个操作前先通过Look对其进行加锁,然后判断操作是否执行成功,成功后释放锁,
缺点:只能用于单机环境,因为Look本身为单机锁,所以不适用于分布式环境。

幂等性的实现会消耗一定的资源,因此不必为每个接口都增加幂等性判断,要根据实际的业务情况和实际操作来进行区分到底要不要添加接口幂等性,例如,我们在进行查询操作和删除操作时就无需添加幂等性判断,可以直接用缓存的方法,因为查询操作查一次或者多次得到的结果都是一致的,因此我们无需进行幂等性判断,删除操作也是一样的,删除一次或者多次的结果都是一样的(这里指的是条件删除,并不是删除所有数据),因此也无需判断幂等性,所以在一些非重要操作时需要根据实际业务需求和具体场景判断一下是否需要添加幂等性判断,不然会增加系统负担。



与API接口幂等性相似的有防止接口重刷,什么是防重刷呢?

接口防重刷关注的是同一个接口的重复请求,以避免重复的操作产生重复数据或者造成不必要的操作,这种设计通常通过检查请求的唯一标识或者时间戳来实现,以确保同一请求不会处理多次。
因此,接口防重刷和接口的幂等性都是关注防止重复请求的问题,但是他们实现的方式和关注点不同,接口防重刷更趋向于避免重复操作,而幂等性关注的则是确保多次请求具有相同的效果。
接口防重刷有以下几种实现方式:

1. 前端页面拦截:通过前端页面进行请求的拦截,例如,用户点击某个操作按钮之后让这个按钮设置为不可用或者灰置,避免用户重复点击,
缺点:有心之人可以通过一些工具来模拟用户请求绕过前端对后端进行多次访问。

2. 缓存:通过缓存来避免重复访问数据库来,从而避免重复操作,具体来说,可以将请求到的结果保存下来,在下一次相同请求到来时直接返回缓存的结果,避免重复计算或查询数据库,
缺点:如果缓存被清空或者过期,会导致重复操作。


标签:API,请求,重复,有何,接口,重刷,利弊,操作
From: https://www.cnblogs.com/wangxie/p/18002410

相关文章

  • OpenHarmony—开发及引用静态共享包(API 9)
    HAR(HarmonyArchive)是静态共享包,可以包含代码、C++库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。接下来,将简单介绍库模块的工程结构,如下图所示:相关字段的描述......
  • 介绍一个超好用的API管理工具:Apipost
    Apipost是一款集API调试、生成文档、Mock、测试于一体的协同工具。单个工具可以同时满足接口测试、生成/分享文档、Mock、流程测试等功能,还有超实用的多人多角色间实时协作的功能。将前端、后端、测试三种角色串联起来,从而实现工作流程无缝衔接、提高研发效率!Apipost的定位是:Pos......
  • pyqt报错、python报错:src/pyaudio/device_api.c:9:10: fatal error: portaudio.h: 没
    报错信息:-DNDEBUG-fwrapv-O2-Wall-fPIC-O2-isystem/home/devil/anaconda3/envs/91/include-fPIC-O2-isystem/home/devil/anaconda3/envs/91/include-fPIC-I/usr/local/include-I/usr/include-I/home/devil/anaconda3/envs/91/include/python3.10-csrc/pyaudio......
  • 零侵入!试试这款Api接口文档生成器!
    大家好,我是Java陈序员。作为一名合格的程序员,不仅代码要写好,而且文档要写好。虽然目前有成熟的框架可以快速生成接口文档,如大名鼎鼎的Swagger.但是Swagger需要编写大量的注解来辅助生成文档,侵入了业务代码。不符合高内聚、低耦合的编程规范!今天,给大家介绍一款零侵入的Api......
  • API管理协作工具:Apipost
    相信无论是前端,还是后端的测试和开发人员,都遇到过这样的困难。不同工具之间数据一致性非常困难、低效。多个系统之间数据不一致,导致协作低效、频繁出问题,开发测试人员痛苦不堪。API管理的难点在哪?开发人员在Swagger定义好文档后,接口调试的时候还需要去Postman再定义一遍。前端......
  • API管理协作工具:Apipost
    相信无论是前端,还是后端的测试和开发人员,都遇到过这样的困难。不同工具之间数据一致性非常困难、低效。多个系统之间数据不一致,导致协作低效、频繁出问题,开发测试人员痛苦不堪。API管理的难点在哪?开发人员在Swagger定义好文档后,接口调试的时候还需要去Postman再定义一遍。前......
  • ChatGPT API调用python和脚本实现
    ChatGPT由于其独特、近乎准确且类似人类的响应,如今在互联网上引起了过多的讨论。本文讨论如何通过Python代码连接到ChatGPTAPI。 第1步:获取OpenAIAPI的API密钥要获取OpenAIAPI的API密钥,您需要在OpenAI网站上注册一个OpenAI帐户。拥有帐户后,您可以按......
  • 记录: OpenAI中转代理API接口服务的使用
    由于OpenAI提供服务的地区列表里没有China,因此想要方便使用OpenAIAPI的话就需要用到中转服务。本文介绍的iDataRiver平台便提供这样的API,且比官方OpenAI还要便宜,其文档地址入口为https://docs.idatariver.com/zh支持模型如何统计消费的token量token是大语言模型处理信息......
  • golang gin框架搭建restapi
    初学golang,尝试用gin框架搭建restapi一)源码准备创建go.mod文件,相当于nodejs中的package.jsongomodinitexamples/web-service-gin新建文件main.go,加入以下代码packagemainimport( "net/http" "github.com/gin-gonic/gin")//albumrepresentsdataaboutarecor......
  • API 调用时的身份认证
    API调用时的身份认证可以使用多种方式来确保安全性,以下是一些常见的处理方式:API密钥(APIKey):每个用户或应用程序都被分配一个唯一的API密钥,用于标识其身份。API密钥通常在HTTP请求的头部或查询参数中传递,服务器端使用这个密钥来验证请求的合法性。这种方式适用于对公开的A......