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

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

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


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

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

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

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

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

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



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

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

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

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


本文作者:王大麻子

本文链接:https://www.cnblogs.com/wangxie/p/18002410

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   王大麻子  阅读(574)  评论(0编辑  收藏  举报
  1. 1 想说 颜人中
  2. 2 孤身 徐秉龙
  3. 3 像暗杀似的绕到背后突然拥抱你 太一
像暗杀似的绕到背后突然拥抱你 - 太一
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 太一

作曲 : 太一

道两旁

一眼望去怎么黄昏秋凉凉

多过一晚

精心打扮

巨可爱的大自然

说好的一起做着丑蜥蜴

结果整容成佳丽

气死了我要烧掉日记

啊啊啊再有虫子不分你

听说蝙蝠包养你

最近刚送了你貂皮

又哪能和我比

四月里

像暗杀似的绕到背后突然拥抱你

动作不用练习

认识你就熟悉

那时候闻起来香的超级

黑夜到白昼 十五楼

黑夜到白昼 十五楼

真的没有没有

看见了光 不流浪

就是没有没有

壮士不看透 这碗粥

说了没有没有

里面藏花 半克拉

呐呐没有没有

黑夜到白昼 十五楼

真的没有没有

看见了光 不流浪

就是没有没有

壮士不看透 这碗粥

说了没有没有

里面藏花 半克拉

呐呐没有没有

骨子里面势必先

骨子里面势必先

口味太重连血都咸

魑魅魍魉死在艳阳天

成鬼成神一线之间

星辰耀眼

凡人藏不住欲望的妖艳

眼里的耳边的梦

布达 布达 蹦

红 红 红

龙头下巴 雷打不动

我非要挑逗

指尖勾着碰碰

摸摸 哼哼

黑夜到白昼 十五楼

黑夜到白昼 十五楼

真的没有没有

看见了光 不流浪

就是没有没有

壮士不看透 这碗粥

说了没有没有

里面藏花 半克拉

呐呐没有没有

果果果真可惜总是被记忆

约定天和地

难过就给猫织件毛衣

正好是冬天里

破又旧还缺了箭的弓

葱油面没了葱

真正暗痛的病来势汹汹

谁救都没有用

是的没用没用没用没用…

💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑
点击右上角即可分享
微信分享提示