美文网首页
[转载] 接口的幂等性

[转载] 接口的幂等性

作者: 翼徳 | 来源:发表于2016-06-08 17:56 被阅读393次

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

"幂等性是指重复使用同样的参数调用同一方法时总能获得同样的结果。比如对同一资源的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) {
// 处理冲突问题: 因为age只可能越来越大,所以将client的age更新为server端更大的age
            int newAge = socket.getPersonAge();
            if(newAge>30) {
                client.age = newAge;
                break;
            } else {
            //无法进行冲突解决,再次尝试
            }
      } else 
            return; 
  } catch(Exception) { 
        //发生网络异常, 再次尝试 
  }
}

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

原创链接:http://www.smithfox.com/?e=16 转载请保留此声明, 谢谢

相关文章

  • [转载] 接口的幂等性

    绝大部分网络上对幂等性的解释类似于: "幂等性是指重复使用同样的参数调用同一方法时总能获得同样的结果。比如对同一资...

  • SpringBoot接口幂等性实现的4种方案!

    目录 什么是幂等性 什么是接口幂等性 为什么需要实现幂等性 引入幂等性后对系统的影响 Restful API 接口...

  • 什么是接口的幂等性,如何实现接口幂等性?一文搞定

    每天一个知识点 什么是接口的幂等性,如何实现接口幂等性? (一)幂等性概念 幂等性原本是数学上的概念,用在接口上就...

  • 接口幂等性

    接口幂等性 什么是接口幂等性? 最简单想到的实现接口幂等性(重复提交)的操作是什么? 最简单稍靠谱的解决方案是什么?

  • 接口幂等性书目录

    1.幂等性定义 1.1 数学定义 1.2 HTTP规范的定义 2. 何种接口提供幂等性 2.1 HTTP支持幂等性...

  • 接口的幂等性的N种考虑

    分布式服务接口的幂等性如何设计 什么是幂等性 一个分布式系统中的某个接口,要保证幂等性,该如何保证?这个事儿其实是...

  • 电商课题:幂等性

    一. 断言: 幂等性的数学表达:f(f(x)) = f(x)。幂等性是系统接口对外的一种承诺。幂等性指的是,使用相...

  • 接口幂等性

    什么是接口幂等性? 幂等是数学和计算机学的概念,常见于抽象代数中,即f(f(x)) = f(x)。简单来讲就是接口...

  • 接口幂等性

    学习缘由 幂等性这个词很高大上,但是又不明白其中含义,因此查资料进行理解学习。参考原文:路人甲java 什么是幂等...

  • 接口幂等性

    一、概念 当微服务之间调用时服务A向服务B重复发送消息或者用户多次点击导致重复操作数据库。 例如支付订单接口,如果...

网友评论

      本文标题:[转载] 接口的幂等性

      本文链接:https://www.haomeiwen.com/subject/jkpjdttx.html