Java接口幂等性,如何重试?

这篇具有很好参考价值的文章主要介绍了Java接口幂等性,如何重试?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java接口幂等性,如何重试?



前言

当我们写好一个项目时,有没有深深的思考过,如何处理接口幂等性问题呢?今天我们以屈原这句著名诗句“路漫漫其修远兮,吾将上下而求索”的精神来探索一下这个问题。


一、幂等性是什么?

幂等性:简单来说就是一个操作多次执行的结果和一次执行产生的结果一致。

二、为什么要幂等性?

答:在计算机应用中,可能造成网络抖动、临时故障、或者服务调用失败,尤其是分布式系统中,接口调用失败更为常见。为了保证服务的完整性,我们可能会发起接口的重试调用,如果接口不处理幂等,可能会对系统造成很大的影响,因此接口的幂等设计尤其重要。

如在支付中,如果没有幂等性,接口的重试可能造成重复支付。

幂等性和防重是不一样的,防重不考虑返回值,幂等性要求返回值一样。
Java接口幂等性,如何重试?

三、使用什么办法实现幂等性?

1.insert前先select

通常情况下,在保存数据的接口中,我们为了防止产生重复数据,一般会在insert前,先根据namecode字段select一下数据。如果该数据已存在,则执行update操作,如果不存在,才执行 insert操作。

缺点: 该方案可能是我们平时在防止产生重复数据时,使用最多的方案。但是该方案不适用于并发场景,在并发场景中,要配合其他方案一起使用,否则同样会产生重复数据。我在这里提一下,是为了避免大家踩坑。

2.加悲观锁

为了解决这个问题,可以加悲观锁,将用户A的那行数据锁住,在同一时刻只允许一个请求获得锁,更新数据,其他的请求则等待。

缺点:不适合幂等性设计场景,但是在防重场景中是可以的使用的。

3.加乐观锁

为了提升接口性能,我们可以使用乐观锁。需要在表中增加一个timestamp或者version字段。

Java接口幂等性,如何重试?

4.加唯一索引

绝大数情况下,为了防止重复数据的产生,我们都会在表中加唯一索引,这是一个非常简单,并且有效的方案。
加了唯一索引之后,第一次请求数据可以插入成功。但后面的相同请求,插入数据时会报Duplicate entry '002' for key 'order.un_code异常,表示唯一索引有冲突。虽说抛异常对数据来说没有影响,不会造成错误数据。但是为了保证接口幂等性,我们需要对该异常进行捕获,然后返回成功。

5.Redis加分布式锁

其实前面介绍过的加唯一索引或者加防重表,本质是使用了数据库分布式锁,也属于分布式锁的一种。但由于数据库分布式锁的性能不太好,我们可以改用:rediszookeeper

redis分布式锁的实现方式有三种:

1、setNx命令

2、set命令

3、Redission框架

具体步骤:

1、用户通过浏览器发送请求,服务器会收集数据,并且生成订单号code作为唯一业务字段。

2、使用redis的set命令,将该订单code设置到redis中,同时设置超时时间。

3、判断是否设置成功,如果设置成功,说明是第一次请求,则数据进行操作。

4、如果设置失败,说明是重复请求,则直接返回成功。
Java接口幂等性,如何重试?

6.获取token

除了上述方案之外,还有最后一种使用token的方案。该方案跟之前的所有方案都有点不一样,需要两次请求才能完成一次业务操作。

两次请求:

1. 第一次请求获取`token`
2. 第二次请求带着这个`token`,完成业务操作。

具体步骤:

  1. 用户访问页面时,浏览器自动发起获取token请求。
  2. 服务端生成token,保存到redis中,然后返回给浏览器。
  3. 用户通过浏览器发起请求时,携带该token。
  4. 在redis中查询该token是否存在,如果不存在,说明是第一次请求,做则后续的数据操作。
  5. 如果存在,说明是重复请求,则直接返回成功。
  6. 在redis中token会在过期时间之后,被自动删除。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了使用什么办法实现幂等性,而具体的解决方案还是需要根据项目自身选择。文章来源地址https://www.toymoban.com/news/detail-499444.html

到了这里,关于Java接口幂等性,如何重试?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 警惕看不见的重试机制:为什么使用RPC必须考虑幂等性

    在RPC场景中因为重试或者没有实现幂等机制而导致的重复数据问题,必须引起大家重视,有可能会造成例如一次购买创建多笔订单,一条通知信息被发送多次等问题,这是技术人员必须面对和解决的问题。 有人可能会说:当调用失败时程序并没有显示重试,为什么还会产生重

    2024年02月06日
    浏览(36)
  • 接口幂等性详解

    所谓接口幂等性就是:在特定场景下,同一条件的多次接口调用,保证操作只执行一次,如果接口没有保证幂等性,在以下场景就会产生问题 前端重复提交:用户进行注册、创建个人信息等操作,由于网络抖动导致页面没有及时响应,用户认为没有成功而多次点击提交按钮,

    2024年02月19日
    浏览(38)
  • 一个注解实现接口幂等性,真心优雅!

    简单来说,就是对一个接口执行重复的多次请求,与一次请求所产生的结果是相同的,听起来非常容易理解,但要真正的在系统中要始终保持这个目标,是需要很严谨的设计的,在实际的生产环境下,我们应该保证任何接口都是幂等的,而如何正确的实现幂等,就是本文要讨

    2024年02月03日
    浏览(40)
  • 114 接口中幂等性的保证

    同样是 面试问题  如何确保接口的 幂等性  幂等是一个 较为抽象的概念, 多次重复访问, 不会导致业务逻辑的异常  这里从增删改查, 几个方面列一下  一般来说, 我们核心需要关注的就是 新增 和 更新 对于 增加元素, 首先针对唯一约束进行校验, 然后再处理新增的相

    2024年04月23日
    浏览(30)
  • 一文搞定接口幂等性架构设计方案

    现如今很多系统都会基于分布式或微服务思想完成对系统的架构设计。那么在这一个系统中,就会存在若干个微服务,而且服务间也会产生相互通信调用。那么既然产生了服务调用,就必然会存在服务调用延迟或失败的问题。当出现这种问题,服务端会进行重试等操作或客户

    2023年04月20日
    浏览(34)
  • 【重复处理】CRUD接口幂等性处理

    非并发情况下,查询业务单号有没有操作过,没有则执行操作 针对第一次执行业务时间,有大量并发情况下,整个操作过程加锁,通过分布式锁来加锁 Select操作:不会对业务数据有影响,天然幂等 Delete操作:第一次已经删除,第二次删除也不会有影响 根据唯一的业务号删除

    2024年02月12日
    浏览(38)
  • 分布式接口幂等性设计实现

    面对分布式架构和微服务复杂的系统架构和网络超时服务器异常等带来的系统稳定性问题,分布式接口的幂等性设计显得尤为重要。本文简要介绍了几种分布式接口幂等性设计实现,包括Token去重机制、乐观锁机制、数据库主键和状态机实现等,以加深理解。 1、分布式接口幂

    2024年02月05日
    浏览(40)
  • Spring Boot 实现接口幂等性的 4 种方案

    现在的系统或平台,为了追求体验性、内容丰富性,都是前后端分离,系统为了解藕会引入各种MQ等,都不可避免就引入了数据幂等性的问题。 幂等是一个数学与计算机学概念,在数学中某一运算为幂等时,其作用在任一元素两次会和其作用一次的结果相同。 在计算机编程中

    2024年02月06日
    浏览(50)
  • redis+token+分布式锁确保接口的幂等性

    目录 1.幂等性是什么? 2.如何实现幂等性呢? 1.新增管理员,出弹窗的同时,请求后台。 2.后端根据雪花算法生成唯一标识key,以雪花数为key存到redis。并返回key给前端。 3.前端保存后端传过来的key。 4.前端输入完成信息,点击【保存】,携带key请求后端。 5.请求到达后端,

    2024年02月14日
    浏览(44)
  • 【微信小程序】Java实现微信支付(小程序支付JSAPI-V3)java-sdk工具包(包含支付出现的多次回调的问题解析,接口幂等性)

          对于一个没有写过支付的小白,打开微信支付官方文档时彻底懵逼 ,因为 微信支付文档太过详细, 导致我无从下手,所以写此文章,帮助第一次写支付的小伙伴梳理一下。 一、流程分为三个接口:(这是前言,先看一遍,保持印象,方便理解代码) 1、第一个接口:

    2024年01月16日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包