广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >如何理解接口幂等性
  • 606
分享到

如何理解接口幂等性

2024-04-02 19:04:59 606人浏览 泡泡鱼
摘要

本篇内容主要讲解“如何理解接口幂等性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解接口幂等性”吧!什么是接口幂等性?首先看看幂等性的概念:幂等性原本是数

本篇内容主要讲解“如何理解接口幂等性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解接口幂等性”吧!

什么是接口幂等性?

首先看看幂等性的概念:

  • 幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口,多次发出同一个请求,必须保证操作只执行一次。  调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。

比如下面这些情况,如果没有实现接口幂等性会有很严重的后果: 支付接口,重复支付会导致多次扣钱 ;订单接口,同一个订单可能会多次创建。

如何理解接口幂等性

为什么会产生接口幂等性问题?

那么,什么情况下,会产生接口幂等性的问题呢?

  • 网络波动, 可能会引起重复请求

  • 用户重复操作,用户在操作时候可能会无意触发多次下单交易,甚至没有响应而有意触发多次交易应用

  • 使用了失效或超时重试机制(Nginx重试、rpc重试或业务层重试等)

  • 页面重复刷新

  • 使用浏览器后退按钮重复之前的操作,导致重复提交表单

  • 使用浏览器历史记录重复提交表单

  • 浏览器重复的Http请求

  • 定时任务重复执行

  • 用户双击提交按钮

如何保证接口幂等性?

那么最关键的来了,如何保证接口幂等性?

解决办法分为两个方向,一个方向是客户端防止重复调用,一个是服务端进行校验。当然,客户端防止重复提交并不是绝对可靠的,优点是实现起来比较简单。

按钮只可操作一次

一般是提交后把按钮置灰或loding状态,消除用户因为重复点击而产生的重复记录,比如添加操作,由于点击两次而产生两条记录

token机制

功能上允许重复提交,但要保证重复提交不产生副作用,比如点击n次只产生一条记录,具体实现就是进入页面时申请一个token,然后后面所有的请求都带上这个token,后端根据token来避免重复请求。

如何理解接口幂等性

使用Post/Redirect/Get模式

在提交后执行页面重定向,这就是所谓的Post-Redirect—Get(PRG)模式,简单来说就是当用户提交连表单后,跳转到一个重定向的信息页面,这样就避免用户按F5刷新导致的重复提交,而且也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退导致同样重复提交的问题。

在session存放特殊标志

在服务端,生成一个唯一的标识符,将它存入session,同时前端获取这个标识符的值将它写入表单的隐藏中,用于用户输入信息后点击一起提交,在服务器端,获取表单中隐藏字段的值,与session中的唯一标识符比较,相等说明是首次提交,就处理本次请求,然后将session中的唯一标识符移除,不相等则表示是重复提交,不再做处理。

使用唯一索引防止新增脏数据

利用数据库唯一索引机制,当数据重复时,插入数据库会抛出异常,保证不会出现脏数据。

乐观锁

如果更新已有数据,可以进行加更新,也可以设计表结构时使用乐观锁,通过version来做乐观锁,这样既能保证执行效率,又能保证幂等,  乐观锁的version版本在更新业务数据要自增

update table set version = version + 1 where id = #{id} and version =  #{version}

示例:  当有重复请求的时候,第一个请求会获取当前商品的version版本号,得到的version为1,紧接着由于第一个请求还没更新商品的version,第二个请求获取的version依然也是1,  这时候第一个请求操作更新的时候带上version并作为条件并且自增更新,这时候商品的version就会变成2,当第二个请求去操作更新的时候明显version不一致导致更新失败。

select + insert or update or delete

该方案就是操作之前先查询一下,符合要求再插入,该方案在没有并发的系统中可以解决幂等问题,在单JVM有并发的时候可以用JVM加锁来保证幂等性,在分布式环境它是无法保证幂等性,可以使用分布式来保证。

分布式锁

如果是分布是系统,构建全局唯一索引比较困难,例如唯一性的字段没法确定,这时候可以引入分布式锁,通过第三方的系统(RedisZooKeeper),在业务系统插入数据或者更新数据,获取分布式锁,然后做操作,之后释放锁,这样其实是把多线程并发的锁的思路,引入多多个系统,也就是分布式系统中得解决思路。要点:某个长流程处理过程要求不能并发执行,可以在流程执行之前根据某个标志(用户ID+后缀等)获取分布式锁,其他流程执行时获取锁就会失败,也就是同一时间该流程只能有一个能执行成功,执行完成后,释放分布式锁(分布式锁要第三方系统提供)。

状态机幂等

在设计单据相关的业务,或者是任务相关的业务,肯定会涉及到状态机(状态变更图),就是业务单据上面有个状态,状态在不同的情况下会发生变更,一般情况下存在有限状态机,这时候,如果状态机已经处于下一个状态,这时候来了一个上一个状态的变更,理论上是不能够变更的,这样的话,保证了有限状态机的幂等。注意:订单等单据类业务,存在很长的状态流转,一定要深刻理解状态机,对业务系统设计能力提高有很大帮助  。

防重表

以支付为例:  使用唯一主键去做防重表的唯一索引,比如使用订单号作为防重表的唯一索引,每一次请求都根据订单号向防重表中插入一条数据,插入成功说明可以处理后面的业务,当处理完业务逻辑之后删除防重表中的订单号数据,后续如果有重复请求,则会因为防重表唯一索引原因导致插入失败,直接返回操作失败,直到第一次请求返回结果,可以看出防重表作用就是加锁的功能。

注: 最好结合状态机幂等先判断一下

缓冲队列

将请求都快速地接收下来后放入缓冲队列中,后续使用异步任务处理队列中的数据,过滤掉重复的请求,该解决方案优点是同步处理改成异步处理、高吞吐量,缺点则是不能及时地返回请求结果,需要后续轮询得处理结果。

全局唯一号

比如通过source来源 + 唯一序列号传入给后端,后端来判断请求是否重复,在并发时只能处理一个请求,其他相同并发请求要么返回请求重复,要么等待  前面请求执行完成后再执行。

到此,相信大家对“如何理解接口幂等性”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 如何理解接口幂等性

本文链接: https://www.lsjlt.com/news/84007.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何理解接口幂等性
    本篇内容主要讲解“如何理解接口幂等性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解接口幂等性”吧!什么是接口幂等性首先看看幂等性的概念:幂等性原本是数学...
    99+
    2022-10-19
  • SpringBoot处理接口幂等性的两种方法详解
    目录1. 接口幂等性实现方案梳理1.1 基于 Token1.2 基于请求参数校验2. 基于请求参数的校验在上周发布的 TienChin 项目视频中,我和大家一共梳理了六种幂等性解决方...
    99+
    2022-11-13
  • 怎么保证接口的幂等性
    本篇内容介绍了“怎么保证接口的幂等性”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言不知道你有没有遇到过...
    99+
    2022-10-19
  • java怎么保证接口的幂等性
    在Java中,可以通过以下几种方式来保证接口的幂等性:1. 使用唯一标识符:在每次请求中,为每个操作生成一个唯一的标识符(例如UUI...
    99+
    2023-08-17
    java
  • 浅谈java接口的幂等性及解决方案
    目录一、什么情况下需要幂等二、幂等性解决方案2.1token机制(令牌)2.2各种锁机制2.3各种唯一约束2.4防重表2.5全局请求唯一id总结一、什么情况下需要幂等 用户多次点击...
    99+
    2022-11-12
  • Redis处理接口幂等性的方案有哪些
    这篇文章主要介绍“Redis处理接口幂等性的方案有哪些”,在日常操作中,相信很多人在Redis处理接口幂等性的方案有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redi...
    99+
    2022-10-19
  • 高并发下的接口如何保证幂等性
    一、背景我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。例如:前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果。我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也...
    99+
    2023-07-26
  • 解决FeignClient重试机制造成的接口幂等性
    FeignClient重试机制造成的接口幂等性 Feign源码分析,其实现类在 SynchronousMethodHandler,实现方法是public Object invoke(...
    99+
    2022-11-12
  • 浅谈Redis处理接口幂等性的两种方案
    目录一、接口幂等性1.1、什么是接口幂等性1.2、为什么需要实现幂等性1.3、引入幂等性后对系统的影响二、如何设计幂等2.1、全局的唯一性ID2.2、幂等设计的基本流程三、接口幂等性常见解决方案3.1、下游传递唯一请求编...
    99+
    2022-08-15
    Redis接口幂等性
  • Springboot利用Redis实现接口幂等性拦截
    目录前言正文实战开始核心三件套工具类三件套REDIS配置类前言 近期一个老项目出现了接口幂等性 校验问题,前端加了按钮置灰, 依然被人拉着接口参数一顿输出,还是重复调用了接口,小陈及...
    99+
    2022-11-13
  • java分布式面试接口如何保证幂等及概念理解
    目录引言1、幂等的概念问题分析:事后问题分析:关于这个接口的幂等设计深入分析:2、工作中常见的幂等设计场景3、幂等接口常见设计方案总结引言 稳定性设计第一篇:这一小节开始讲设计系统稳...
    99+
    2022-11-13
  • Springboot怎么利用Redis实现接口幂等性拦截
    今天小编给大家分享一下Springboot怎么利用Redis实现接口幂等性拦截的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。...
    99+
    2023-07-02
  • 架构设计 | 接口幂等性原则,防重复提交Token管理
    本文源码:GitHub·点这里 || GitEE·点这里一、幂等性概念1、幂等简介编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。就是说,一次和多次请求某一个资源会产生同样的作用影响。2、HTTP请求遵循Htt...
    99+
    2023-06-02
  • SpringBoot结合Redis实现接口幂等性的示例代码
    目录介绍实现过程引入 maven 依赖spring 配置文件写入引入 Redis自定义注解token 的创建和实现拦截器的配置测试用例介绍 幂等性的概念是,任意多次执行所产生的影响都...
    99+
    2022-11-13
  • 使用SpringBoot实现接口幂等性的方法有哪些
    使用SpringBoot实现接口幂等性的方法有哪些?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、什么是幂等性幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其...
    99+
    2023-06-07
  • Java幂等性与分布式锁怎么理解
    本篇内容主要讲解“Java幂等性与分布式锁怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java幂等性与分布式锁怎么理解”吧!1.  什么是幂等性幂等性就是指:一个幂等操作任其...
    99+
    2023-06-05
  • RabbitMQ 如何解决消息幂等性的问题
    前言 关于MQ消费者的幂等性问题,在于MQ的重试机制,因为网络原因或客户端延迟消费导致重复消费。使用MQ重试机制需要注意的事项以及如何解决消费者幂等性问题以下将逐一讲解。 1. Ra...
    99+
    2022-11-12
  • java重试机制使用RPC必须考虑幂等性原理解析
    目录文章概述1 为什么重试2 怎么做重试2.1 集群容错策略(1) Failover(2) Failfast(3) Failsafe(4) Failback(5) Forking(6...
    99+
    2023-03-19
    java重试机制RPC幂等性 RPC幂等性原理
  • SpringBoot + Redis如何解决重复提交问题(幂等)
    目录幂等:解决方案:一、搭建Redis服务二、自定义注解三、Token创建和校验四、拦截器配置五、正常Sevice类六、Controller类七、测试在开发中,一个对外暴露的接口可能...
    99+
    2022-11-12
  • 关于消息队列如何保证消息的幂等性
    目录什么是幂等性什么是消息的幂等性为什么会出现消息幂等性问题该如何解决消息幂等性问题在分布式系统中,消息队列是一个常用的组件,用于解耦发送者和接收者之间的耦合。在消息队列中,保证消息...
    99+
    2023-05-18
    消息队列 消息队列 幂等性
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作