幂等性 个人理解及应用

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

"幂等性是指重复使用同样的参数调用同一方法时总能获得同样的结果。比如对同一资源的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){
        //发生网络异常, 再次尝试
    }
}

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

时间: 2024-10-18 16:45:21

幂等性 个人理解及应用的相关文章

幂等策略分析

幂等概念来自数学,表示N次变换和1次变换的结果是相同的.这里讨论在某些场景下,客户端在调用服务没有达到预期结果时,会进行多次调用,为避免多次重复的调用对服务资源产生副作用,服务提供者会承诺满足幂等. 举个栗子,双十一零点刚过,小明就迫不及待地点击提交订单按钮,选择在线支付,点了确认支付按钮,这时候网络有些慢,小明担心心爱的商品被抢购一空,就点了多次确认付款按钮,如果这个订单扣款多次,客服热线估计会被小明打爆. 什么是幂等性 HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身

理解HTTP幂等性

基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式.无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web API.为什么Web API如此流行呢?我认为很大程度上应归功于简单有效的HTTP协议.HTTP协议是一种分布式的面向资源的网络应用层协议,无论是服务器端提供Web服 务,还是客户端消费Web服务都非常简单.再加上浏览器.Javascript.AJAX.JSON以及HTML5等技术和工具的发展,互联网应用架构设 计表现出了从传统的P

#HTTP协议学习# (十一)理解HTTP幂等性

在httpcomponent 文档中看到如下段落: 1.4.1. HTTP transport safety It is important to understand that the HTTP protocol is not well suited to all types of applications. HTTP is a simple request/response oriented protocol which was initially designed to support s

[转]理解HTTP幂等性

基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式.无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web API.为什么Web API如此流行呢?我认为很大程度上应归功于简单有效的HTTP协议.HTTP协议是一种分布式的面向资源的网络应用层协议,无论是服务器端提供Web服务,还是客户端消费Web服务都非常简单.再加上浏览器.Javascript.AJAX.JSON以及HTML5等技术和工具的发展,互联网应用架构设计表现出了从传统的PHP

理解HTTP幂等性(转)

基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式.无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web API.为什么Web API如此流行呢?我认为很大程度上应归功于简单有效的HTTP协议.HTTP协议是一种分布式的面向资源的网络应用层协议,无论是服务器端提供Web服 务,还是客户端消费Web服务都非常简单.再加上浏览器.Javascript.AJAX.JSON以及HTML5等技术和工具的发展,互联网应用架构设 计表现出了从传统的P

理解http的幂等性

幂等性是什么? 幂等性--是系统的接口对外一种承诺(而不是实现),承诺只要调用接口成功,外部多次调用对系统的影响是一致的.一个幂等的操作典型如:把编号为5的记录的A字段设置为0,这种操作不管执行多少次都是幂等的.一个非幂等的操作典型如:把编号为5的记录的A字段增加1,这种操作显然就不是幂等的. 要做到幂等性,从接口设计上来说不设计任何非幂等的操作即可.譬如说需求是:当用户点击赞同时,将答案的赞同数量+1.改为:当用户点击赞同时,确保答案赞同表中存在一条记录,用户.答案.赞同数量由答案赞同表统计出

深入理解幂等性

什么是幂等性 HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外).也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同. Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is th

深入理解Oracle RAC 12c

深入理解Oracle RAC 12c(顶尖专家权威指南唯一最新版数据库著作 Oracle第一社区技术大牛翻译 Amazon五星推荐) [美]Syed Jaffar Hussain(赛义德 贾法尔 侯赛因),Tariq Farooq(塔里克 法鲁克),Riyaj Shamsudeen(瑞亚吉沙姆斯丁),Kai Yu(于凯) 著   赵燚 梁涛 程飞 李真旭 译 ISBN 978-7-121-24066-9 2014年10月出版 定价:99.00元 488页 16开 编辑推荐 <深入理解 Oracl

HTTP幂等性简单了解

基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式.无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web API.为什么Web API如此流行呢?我认为很大程度上应归功于简单有效的HTTP协议.HTTP协议是一种分布式的面向资源的网络应用层协议,无论是服务器端提供Web服务,还是客户端消费Web服务都非常简单.再加上浏览器.Javascript.AJAX.JSON以及HTML5等技术和工具的发展,互联网应用架构设计表现出了从传统的PHP