我的编程空间,编程开发者的网络收藏夹
学习永远不晚

什么是幂等性

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

什么是幂等性

这篇文章主要介绍“什么是幂等性”,在日常操作中,相信很多人在什么是幂等性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是幂等性”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

什么是幂等性

 1 幂等性

1.1 定义

幂等概念来自数学,表示对数据源做N次变换和1次变换的结果是相同的。在工程中幂等性用来表示用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。

  • 幂等包括第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。

  • 幂等关注的是以后的多次请求是否对资源产生的副作用,而不关注结果。

  • 网络超时等问题,不是幂等的讨论范围。

  • 幂等性是系统服务对外一种承诺,而不是实现,承诺只要调用接口成功,外部多次调用对系统的影响是一致的。声明为幂等的服务会认为外部调用失败是常态,并且失败之后必然会有重试。

1.2 场景

业务开发时,可能会遇到由于网络震荡导致请求无法收到导致触发了重试机制,或者前端抖动导致表单重复提交这样的情况。比如在交易系统中,用户提交购物请求已经被服务器端正确处理,但服务器端的返回结果由于网络等原因被掉丢了,导致客户端无法得知处理结果。如果是在网页上,一些不恰当的设计可能会使用户认为上一次操作失败了,然后刷新页面,这就导致了扣款被调用两次,账户也被多扣了一次钱。此时就需要引入幂等性接口了。

我们以MySQL为例,只有第三种场景需要开发人员使用其他策略保证幂等性:

SELECT col1 FROM tab1 WHER col2=2;  -- 无论执行多少次都不会改变状态,是天然的幂等。 UPDATE tab1 SET col1=1 WHERE col2=2;  -- 无论执行成功多少次状态都是一致的,因此也是幂等操作。 UPDATE tab1 SET col1=col1+1 WHERE col2=2;  -- 每次执行的结果都会发生变化,这种不是幂等的。

这里说下重复提交跟幂等性的区别:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 重复提交是在第一次请求已经成功的情况下,人为的进行多次操作,导致不满足幂等要求的服务多次改变状态。

  3. 幂等更多使用的情况是第一次请求不知道结果(比如超时)或者失败的异常情况下,发起多次请求,目的是多次确认第一次请求成功,却不会因多次请求而出现多次的状态变化。

1.3 幂等性思考

引入幂等性后会使得服务端逻辑更加复杂,满足幂等性的服务需要在逻辑中至少包含两点:

首先去查询上一次的执行状态,如果没有则认为是第一次请求。

在服务改变状态的业务逻辑前,保证防重复提交的逻辑。

幂等性可以简化客户端逻辑处理,但却增加了服务提供者的逻辑和成本,所以是否要用,需根据具体场景具体分析,因此除了业务上的特殊要求外,尽量不提供幂等的接口。

增加了额外控制幂等的业务逻辑,复杂化了业务功能。

把并行执行的功能改为串行执行,降低了执行效率。

2 幂等性解决

2.1 前端设置

在用户点击完提交按钮后,我们可以把按钮设置为不可用或者隐藏状态。

什么是幂等性

前端限制比较简单,但有个致命错误,如果碰到懂行的用户通过模拟网页请求来重复提交请求,绕过了前端限制。

2.2 唯一索引

防止订单多次插入的最简单直接方法就是创建唯一索引,然后插入的时候可能语句有细微的不同。但目的都是保证相同记录在数据库中只存在一条。

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 方法一:给数据库添加唯一索引,然后如果执行时捕捉到了DuplicateKeyException会明白是重复插入导致的,继续往下执行业务即可。

  3. 方法二:利用MySQL自带的关键字ON DUPLICATE KEY UPDATE 实现不存在则插入,存在则更新的操作,该关键字不会删除原有的记录。

  4. 方法三:replace into 主要作用类似 INSERT 插入操作,replace  into底层是先删除后插入数据,会破坏索引、重新维护索引。需注意必须要有主键或唯一索引才能有效,否则replace into就只新增了。

2.3 去重表

去重表的机制是根据mysql唯一索引的特性来的,大致流程:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 客户端先请求服务端,服务端先将这次的请求信息存入一张mysql的去重表中,这张表要根据这次请求的其中某个特殊字段建立唯一索引,或者主键索引。

  3. 判断是否插入成功,如果插入成功,则继续做后续业务请求。如果插入失败,则代表已经执行过当前请求。

什么是幂等性

2.4 悲观锁

什么是幂等性

方式一:简单的利用Java自带的syn 或 lock  锁实现幂等性。核心点在于将重要的执行部分将并行切换为串行。缺点是这个锁在分布式场景是不能用的,因为都跨JVM了!此时需要引入分布式锁了。

什么是幂等性

依靠MySQL自带的for update操作数据库,来实现串行化。这里的重点在于for update,简单说明下:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 当线程A执行for update,数据会对当前记录加锁,其他线程执行到此行代码的时候,会等待线程A释放锁之后,才可以获取锁,继续后续操作。

  3. 事物提交时,for update获取的锁会自动释放。

该模式的缺点是,如果业务处理比较耗时,并发情况下,后面线程会长期处于等待状态,占用了很多线程,让这些线程处于无效等待状态,而web服务中的线程数量一般有限的,如果大量线程由于获取for  update锁处于等待状态,不利于系统并发操作。

2.5 乐观锁

对每行数据添加个version字段,这里其实跟秒杀设计中的思路类似,利用MySQL自带的当前读更新操作。在更新数据时候先查询获得对应版本号,然后尝试update操作,根据返回值是否为0来确保是否是重复提交。

select id,name,account,version from user where id = 1412; // 假设获得的 version = 10  update user set account = account + 10,version = version + 1  where id = 1412 and version = 10;

什么是幂等性

2.6 分布式锁

使用Redis中的setnx操作,将幂等性的保证屏障设置在分布式锁中。如果setnx成功了说明这是第一次进行数据插入,继续执行SQL语句即可。如果setnx失败了,那说明已经执行过了。

什么是幂等性

2.7 token 方案

这种方式分成两个阶段:申请token阶段和支付阶段。

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 第一阶段:在进入到提交订单页面之前,需要订单系统根据用户信息向支付系统发起一次申请token的请求,支付系统将token保存到Redis缓存中,为第二阶段支付使用。

  3. 第二阶段:订单系统拿着申请到的token发起支付请求,支付系统会检查Redis中是否存在该token,如果存在,表示第一次发起支付请求,删除缓存中token后开始支付逻辑处理;如果缓存中不存在,表示非法请求。

实际上这里的token可以认为是一个信物,支付系统根据token确认插入的唯一性。token模式不足之处在于,需要系统间交互两次,流程较上述方法复杂。

什么是幂等性

到此,关于“什么是幂等性”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

什么是幂等性

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

下载Word文档

猜你喜欢

69.幂等性

参考:https://www.cnblogs.com/baizhanshi/p/10449306.html 1.情景 1.1 重复提交页面数据 效果:        解决方案:       1.2 高并发下update 1.3 库存减少问题
69.幂等性
2016-01-11

rabbitmq消息的幂等性怎么保证

保证RabbitMQ消息的幂等性可以使用以下方法:消费者端幂等性:在消费者端处理接收到的消息时,可以使用唯一标识符来判断该消息是否已经被处理过。可以将每条消息的唯一标识符存储在数据库或缓存中,并在处理消息之前先查询该标识符是否已存在。如果已
2023-10-27

java怎么保证接口的幂等性

在Java中,可以通过以下几种方式来保证接口的幂等性:1. 使用唯一标识符:在每次请求中,为每个操作生成一个唯一的标识符(例如UUID),并将其包含在请求的参数或头部中。服务器端可以通过检查标识符来验证请求的幂等性,如果服务器已经处理了具有
2023-08-17

4.RabbitMQ高级特性 幂等 可靠消息 等等

一、如何保证生产者生产消息100%的投递成功 保障消息的成功发出保障MQ节点的成功接收发送端收到MQ节点(Broker)确认应答完善的消息进行补偿机制 1. 理解Confirm确认消息机制 消息的确认,是指生产者投递消息后,如果Broker
2023-08-30

Kafka中的消息幂等性怎么保证

Kafka中的消息幂等性可以通过以下几种方式来保证:Producer端设置幂等性:在Producer端发送消息时,可以设置消息的Idempotent Producer属性为true,这样就可以保证同一个Producer发送的相同消息只会被处
Kafka中的消息幂等性怎么保证
2024-03-14

redis怎么实现幂等

在Redis中实现幂等性可以通过以下几种方式:1. 使用Redis的原子操作:Redis支持一些原子操作,如SETNX(设置键值对,如果键不存在则设置成功,返回1;如果键已存在则设置失败,返回0)、EXPIRE(设置键的过期时间)、DEL(
2023-09-11

Golang regexp MatchString() 不是幂等的

问题内容我不知道发生了什么。使用golang的regexp库时,相同的函数相同的输入返回不同的结果。package mainimport ("fmt""regexp")type paymentnetworkdata struct {r
Golang regexp MatchString() 不是幂等的
2024-02-06

MongoDB中怎么确保写操作的幂等性

在MongoDB中,可以通过以下几种方式来确保写操作的幂等性:使用唯一字段或索引:可以在集合中创建唯一字段或索引,确保每个文档的唯一性,这样在插入或更新操作时,如果重复插入相同的文档,数据库会抛出唯一键约束错误,从而确保幂等性。使用Upda
MongoDB中怎么确保写操作的幂等性
2024-04-19

Java幂等性与分布式锁怎么理解

本篇内容主要讲解“Java幂等性与分布式锁怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java幂等性与分布式锁怎么理解”吧!1. 什么是幂等性幂等性就是指:一个幂等操作任其执行多次所
2023-06-05

Springboot怎么利用Redis实现接口幂等性拦截

今天小编给大家分享一下Springboot怎么利用Redis实现接口幂等性拦截的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
2023-07-02

高并发下的接口如何保证幂等性

一、背景我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。例如:前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果。我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也
2023-07-26

springboot幂等切片怎么实现

本篇内容介绍了“springboot幂等切片怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前言最近测试提某些接口重复提交的问题,
2023-06-29

编程热搜

目录