幂等性

幂等这个词原自数学,某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。在编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。这里的副作用是不会对结果产生破坏或者产生不可预料的结果。

比如,某服务记录关键数据 X,当前值为 100。A 请求需要将 X 增加 200;同时,B 请求需要将 X 减去 100。在理想的情况下,A 先读取到 X=100,然后 X 增加 200,最后 X=300。B 请求接着从读取 X=300,减去 100,最后 X=200。 然而在真实情况下,如果不做任何处理,则可能会出现:A 和 B 同时读取到 X=100;假如 A 比 B 先执行完,那么最后 X=0,如果 B 比 A 先执行完,那么最后 X=300。不管是那种情况发生了,都产生了副作用或者说是产生了不可预料的结果,并且是不可以接受的异常。这种情况就是我们提供的方法或者接口不满足幂等性,导致的不可预料的结果。

保证幂等性的方法

1.建立唯一索引,防止新增脏数据

这个可以限制重复插入数据,当重复时,数据库会抛异常,保证不会出现脏数据。但体验不好,并且实用场景有限制。

2.利用 token 机制,防止页面重复提交

核心思想是为每一次操作生成一个唯一性的凭证,也就是token。一个token在操作的每一个阶段只有一次执行权,一旦执行成功则保存执行结果。对重复的请求,返回同一个结果。

3.状态机幂等

在有状态的数据中可以使用,如果状态机已经处于下一个状态,这时候来了一个上一个状态的变更,理论上是不能够变更的,这样的话,保证了有限状态机的幂等。如果状态是顺序的,不可逆,那么就不会出现 ABA 问题,否则会出现 ABA问题。

4.select + insert

这种情况在没有并发的系统中可以解决幂等问题,在单JVM有并发的时候可以加锁来保证幂等性,在分布式环境它是没发保证幂等的,这时候需要用到分布式锁来保证。

5.分布式锁

在进入方法时,先去获取锁,假如获取到锁,就继续后面的流程。假如没有获取到锁,就等待锁的释放直到获取到锁。当执行完方法时,释放锁。当然,锁要设个超时时间,防止意外没有释放到锁。它用来解决分布式系统的幂等性,常用的实现方案是 redis 和 zookeeper 等工具。

6.对外提供幂等的接口

通过 source来源+seq序列号来判断请求是否重复, 在并发时只能处理一个请求。其它相同并发请求要么返回请求重复,要么等待前面请求执行完成在执行。

幂等性的不足

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

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

最后,幂等性虽然复杂化了业务功能和降低了执行效率,但为了保证系统的正确性,是必要的。就上面更新 X 的例子,在单台服务器上,给那段代码加上锁,并给 X 设为 volatile,就保证来数据的正确性了。在分布式环境下并且 X 是从数据库或者文件里查询出来的,用上面加锁的方式实现就不能保证数据的正确性了,这时候就需要用到分布式锁了。所以,保证方法或接口的幂等性是非常有必要的,因为数据是不能出现任何问题的。

PS:

清山绿水始于尘,博学多识贵于勤。

微信公众号:「清尘闲聊」。

欢迎一起谈天说地,聊代码。

php 幂等性,幂等性的作用及实现相关推荐

  1. Kafka producer的事务和幂等性

    背景:kafka 客户端之producer API发送消息以及简单源码分析 从Kafka 0.11开始,KafkaProducer又支持两种模式:幂等生产者和事务生产者.幂等生产者加强了Kafka的交 ...

  2. 什么是幂等性、幂等性解决方案

    一.什么是幂等性 幂等性是一个技术术语.类似鉴权.都有一堆的解决方案 二.什么情况需要幂等 业务开发中,经常会遇到重复提交的情况,无论是由于网络问题无法收到请求结果而重新发起请求,或是前端的操作抖动而 ...

  3. 如何保证消息不被重复消费啊(如何保证消息消费时的幂等性)?

    1.面试题 如何保证消息不被重复消费啊(如何保证消息消费时的幂等性)? 2.面试官心里分析 其实这个很常见的一个问题,这俩问题基本可以连起来问.既然是消费消息,那肯定要考虑考虑会不会重复消费?能不能避 ...

  4. 如何保证消息不被重复消费~~~~~(如何保证消息队列的幂等性)

    分析:这个问题其实换一种问法就是,如何保证消息队列的幂等性?这个问题可以认为是消息队列领域的基本问题.换句话来说,是在考察你的设计能力,这个问题的回答可以根据具体的业务场景来答,没有固定的答案. 回答 ...

  5. http 安全性和幂等性_HTTP方法:幂等性和安全性

    http 安全性和幂等性 幂等性和安全性是HTTP方法的属性. HTTP RFC定义了这些属性,并告诉我们哪些HTTP方法是安全且幂等的. 服务器应用程序应确保正确执行安全和幂等的语义,如客户端期望的 ...

  6. 如何保证接口的幂等性

    如何保证接口的幂等性 什么是幂等性 幂等性是系统服务对外一种承诺,承诺只要调用接口成功,外部多次调用对系统的影响是一致的.声明为幂等的服务会认为外部调用失败是常态,并且失败之后必然会有重试. 通俗地说 ...

  7. 消息队列MQ如何保证消息的幂等性

    Table of Contents 一.出现非幂等性的情况 二.解决办法 1.mq接收生产者传来的消息: 2.消费者消费mq中的消息: 三.重复消费可能会在什么场景下出现(以kafka为例) 怎么保证 ...

  8. 利用幂等性区分HTTP的POST与PUT请求

    1.什么是幂等性 幂等性概念:幂等通俗来说是指不管进行多少次重复操作,都是实现相同的结果. 2.REST请求中哪些是幂等操作 GET,PUT,DELETE都是幂等操作,而POST不是,以下进行分析: ...

  9. 安全架构-HTTP协议幂等性

    安全架构-HTTP协议幂等性 幂等性设计是架构师必须具备的技能之一,需要深入理解幂等性设计的相关原理和解决方法. 上一篇文章中介绍了api接口的幂等性,主要从业务逻辑处理的方面进行业务保障,做到实现幂 ...

最新文章

  1. getBoundingClientRect的用法
  2. 【转】Jenkins详细教程
  3. ucos实时操作系统应用开发流程
  4. 大数据(3) - 高可用 HDFS HA
  5. 干货:手把手教你在音频分类DCASE2017比赛中夺冠
  6. python执行速度太慢为什么还_为什么你写的Python运行的那么慢呢?
  7. 分别采用线性LDA、k-means和SVM算法对鸢尾花数据集和月亮数据集进行二分类可视化分析
  8. Android中ListActivity的使用和在ListView中添加图片文字
  9. Spring Cloud 菜鸟教程 1 简介
  10. MATLAB基础知识——xlsread
  11. 删除双系统遗留的efi
  12. Ubuntu16.04安装Caffe史上最详细教程(CPU),亲测三次!!!
  13. 欧拉角中各种角度的名称
  14. sql注入——布尔注入
  15. LHS与RHS查询(已完结)
  16. pycharm使用eval reset不能重置
  17. TensorRT教程18:使用DLA(深学习加速器)
  18. 一条命令导出电脑中所有wifi账号密码
  19. Android7.0编译出现问题(Failed to contact Jack server)
  20. WPF开发学生信息管理系统【WPF+Prism+MAH+WebApi】(一)

热门文章

  1. Android Material Design 控件常用的属性
  2. 我们M2M项目组成员简介
  3. Spring中进行事务管理的两种方式
  4. Unity之C#学习笔记(11):静态类型 Static
  5. android 入门作品之 特价淘宝客-生活查询助手1.0- 微课堂
  6. elementui 手动上传头像
  7. wd移动硬盘不能识别_wd的移动硬盘为什么一直是无法识别的usb设备
  8. mysql rollup语法_SQL 中ROLLUP 用法
  9. 义乌个体工商户怎么办理收汇结汇流程有哪些
  10. 开课吧T31项目第10天