`
hongtoushizi
  • 浏览: 370689 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

幂等性

    博客分类:
  • php
阅读更多

绝大部分网络上对幂等性的解释类似于:

"幂等性是指重复使用同样的参数调用同一方法时总能获得同样的结果。比如对同一资源的GET请求访问结果都是一样的。"

我认为这种解释是非常错误的, 幂等性强调的是外界通过接口对系统内部的影响, 外界怎么看系统和幂等性没有关系. 就上面这种解释, System.getCPULoad(), 这两次调用返回能一样吗? 但因为是只读接口, 对系统内部状态没有影响, 所以这个函数还是幂等性的.

首先了解一下什么是幂等性,如果你没有兴趣可以直接跳过这段代数概念解释 :)

幂等(idempotence)是来自于高等代数中的概念。

定义如下(加入了自己理解):

单目运算, x为某集合内的任意数, f为运算子如果满足f(x)=f(f(x)), 那么我们称f运算为具有幂等性(idempotent)

比如在实数集中,绝对值运算就是一个例子: abs(a)=abs(abs(a))

双目运算,x为某集合内的任意数, f为运算子如果满足f(x,x)=x, f运算的前提是两个参数都同为x, 那么我们也称f运算为具有幂等性

比如在实数集中,求两个数的最大值的函数: max(x,x) = x, 还有布尔代数中,逻辑运算 "与", "或" 也都是幂等运算, 因为他们符合AND(0,0) = 0, AND(1,1) = 1, OR(0,0) = 0, OR(1,1) = 1

在将幂等性应用到软件开发中,需要一些更深的理解. 我的理解如下:

数学处理的是运算和数值, 程序开发中往往处理的是对象和函数. 但是我们不能简单地理解为数学幂等中的运算就是函数,而数值就是对象!!

比如有Person对象有两个属性weight和age,但是所有的function只能对其中一个属性操作. 所以从这个层面我们可以理解为: 函数只对该函数所操作的对象某个属性具有幂等性, 而不是说对整个对象有运算幂等性.

Person {
 private int weight;
 private int age;
 //是幂等函数
 public void setAge(int v){
     this.age = v; 
 }
 //不是幂等函数
 public void increaseAge(){
     this.age++;
 } 
 //是幂等函数
 public void setWeight(int v){
     this.weight=v+10;//故意加10斤!!
 }
}

还有一点必须要澄清的是: 幂等性所表达的概念关注的是数学层面的运算和数值, 并没有提及到数值的安全性问题.

比如上面的Person的setAge函数, 有两种case不是幂等性所关心的, 但程序开发却又必须要关心的:

1. 两个线程同时调用

2. 因为age从业务上讲不可能递减, 如果前一次调用设置是30岁, 后一次调用变成了10岁或是更离谱的 -1 岁

所以RESTful设计中将幂等性和安全性是作为两个不同的指标来衡量POST,PUT,GET,DELETE操作的:

重要方法 安全? 幂等?
GET
DELETE
PUT
POST

 

 

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

就象cache有cache基本实现范式一样, 幂等也有自己的固定外部调用范式
cache实现范式:
value getValue(key){
    value = getValueFromCache(key);

    if( value == null ){
        value = readFromPersistence(key);
        saveValueIntoCache(key,value);
    }

    return value;
}
幂等外部调用范式
client.age = 30;

while(一些退出条件){
    try{
        if(socket.setPersonAge(person,client.age) == FAILED){
	        int newAge = socket.getPersonAge();
	        //处理冲突问题: 因为age只可能越来越大,所以将client的age更新为server端更大的age
	        if(newAge>30){
			client.age = newAge;
			break;
		} else{
			//无法进行冲突解决,再次尝试
		}
        } else return;
    } catch(Exception){
        //发生网络异常, 再次尝试
    }
}

幂等接口的内部实现需要有对内保护机制, 一般情况是用类似于乐观锁的版本机制.版本重点是体现时间的先后.

 

转载自: http://www.smithfox.com/?e=16

分享到:
评论

相关推荐

    幂等性和支付订单防重复

    ### 幂等性及其在支付订单中的应用 #### 一、幂等性的概念与特性 在探讨幂等性之前,我们首先要明确一个概念——幂等性。幂等性源自数学领域,后被广泛应用于计算机科学中,特别是网络通信和分布式系统中。在HTTP...

    接口幂等性解决方案完整代码

    在IT行业中,接口幂等性是一个重要的概念,尤其是在分布式系统和微服务架构中。幂等性指的是一个操作无论执行多少次,其结果始终相同,不会对系统状态造成额外的影响。这种特性对于保证数据一致性、避免重复处理以及...

    38_分布式系统中接口的幂等性该如何保证?比如不能重复扣款?.zip

    在分布式系统设计中,接口的幂等性是一个关键概念,尤其是在金融系统或者订单处理系统中,确保操作的唯一性和不可重复执行是至关重要的。例如,我们提到的“不能重复扣款”的需求,就直接涉及到幂等性的应用。下面将...

    P21_创建Company资源POST_P20_HTTP方法的安全性与幂等性_Routine.Api2020_2_7.rar

    P21_创建Company资源POST_P20_HTTP方法的安全性与幂等性_Routine.Api2020_2_7.rar 使用 ASP.NET Core RESTful API ReSharper ApiController 创建Company资源POST 成功后Status:201 Created time:602ms Date:Fri,...

    RabbitMQ消费端幂等性概念及解决方案.docx

    ### RabbitMQ消费端幂等性概念及解决方案 #### 一、幂等性的基本概念 **幂等性**是指用户对于同一个操作发起一次请求或多次请求的结果保持一致的特性。例如,在数据库操作中,通过实现乐观锁机制来确保幂等性。...

    并发和幂等性

    高并发和幂等性、高并发和幂等性问题解决场景和方案,觉得好用!

    高并发下的接口幂等性解决方案.docx

    "高并发下的接口幂等性解决方案" 高并发下的接口幂等性解决方案是指在高并发环境下,如何确保接口的幂等性,避免重复提交、重复操作等问题。幂等性是指一个操作,不论执行多少次,产生的效果和返回的结果都是一样的...

    分布式架构中的幂等性

    ### 分布式架构中的幂等性 #### 一、幂等性的定义与意义 幂等性(Idempotence)在计算机科学中是一个重要的概念,它指的是对于同一个输入,无论执行多少次都只会产生相同的效果。从数学的角度来看,幂等性可以表示...

    系统接口幂等性规范

    在IT行业中,系统接口幂等性是一个至关重要的概念,尤其对于设计高可用、高可靠性的分布式系统来说。本文将深入探讨这个主题,并基于提供的“幂等.pptx”文件内容进行详细阐述。 幂等性(Idempotency)是指一个操作...

    02、接口幂等性1

    在IT行业中,接口幂等性是一项重要的设计原则,特别是在分布式系统和微服务架构中。它确保了对同一接口的多次请求不会导致额外的副作用。在本文中,我们将深入探讨接口幂等性的概念、应用场景以及实现策略。 一、...

    3.2)幂等性以及消息的幂等性1

    幂等性是分布式系统设计中的一个重要概念,特别是在接口调用和消息传递中。它指的是对于同一个操作,无论执行一次还是多次,结果始终相同,不会产生额外的影响。这种特性在确保系统稳定性和一致性方面起着关键作用。...

    高并发下接口幂等性解决方案.docx

    "高并发下接口幂等性解决方案" 在高并发下,接口幂等性是非常重要的概念,它可以确保在高并发情况下,接口的执行结果是一致的,不会因为并发的原因而导致结果的不确定性。 幂等性概念: 幂等操作是指可以使用相同...

    高并发场景下如何保证接口幂等性?综合比较了防重令牌(token)、随机字符串(noncestr)、幂等表、防重表、数据库唯一索引

    在高并发场景中,接口幂等性是一个至关重要的概念,它确保同一个请求无论被调用多少次,结果始终一致,避免出现重复操作导致的数据不一致问题。本文将深入探讨几种常见的幂等性实现策略,包括防重令牌(Token)、...

    理解HTTP幂等性

    理解幂等性对于设计高质量的 Web API 是非常重要的。 幂等性的定义来自于 HTTP/1.1 规范,指的是 Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side...

    java如何保证接口的幂等性

    前端在向后台发起接口请求的时候,首先向后端请求一个全局的Token,请求的时候携带上这个全局Token请求后端接口。 后台需要将这个Token作为key,用户的...这样就会保证了幂等操作。 适用于新增、更新、删除操作。

    一口气说出四种幂等性解决方案,面试官露出了姨母笑~.docx

    幂等性解决方案及实现方法总结 幂等性是数学和计算机科学中一个重要的概念,它描述了一个操作在任意多次执行后对系统状态没有影响的特点。在编程中,幂等函数或幂等方法是指可以使用相同参数重复执行,并能获得相同...

    分布式系统的接口幂等性设计.docx

    分布式系统中的接口幂等性设计是确保系统稳定性和可靠性的重要原则。幂等性源自数学概念,指的是一个操作或函数重复执行多次与执行一次的效果相同。在软件工程中,特别是分布式系统中,幂等性对于处理网络延迟、请求...

    四种幂等性解决方案.docx

    幂等性是软件设计中的一个重要概念,特别是在分布式系统和接口设计中。它的核心思想是确保一个操作无论执行多少次,其结果始终一致,不会因为重复执行而产生额外的影响。这在保证系统稳定性和数据一致性方面至关重要...

    如何保证接口幂等性的方法

    ### 如何保证接口幂等性的方法 #### 1. 为什么要保证幂等性? 幂等性是指一个操作或指令无论被执行多少次,其结果都与只执行一次相同。这一概念对于构建稳定可靠的软件系统至关重要。在分布式系统和互联网应用中,...

    分布式系统一致性(ACID、CAP、BASE、二段提交、三段提交、TCC、幂等性)原理详解1

    在本文中,我们将深入探讨几种重要的理论和实践方法,包括ACID特性、CAP定理、BASE原则,以及几种常见的分布式事务处理协议:二段提交、三段提交和TCC(Try-Confirm-Cancel)模式,同时也会提到幂等性这一关键概念。...

Global site tag (gtag.js) - Google Analytics