理解 HTTP 幂等性
基于 协议的 是时下最为流行的一种分布式服务提供方式。无论是
在大型互联网应用还是企业级架构中,我们都见到了越来越多的 或
的 。为什么 如此流行呢?我认为很大程度上应归功于简单有效
的 协议。 协议是一种分布式的面向资源的网络应用层协议,无论是服
务器端提供 服务,还是客户端消费 服务都非常简单。再加上浏览器、
、、 以及 等技术和工具的发展,互联网应用架构设
计表现出了从传统的 、、 等服务器端动态网页向
(富互联网应用)过渡的趋势。 专注于提供业务服务, 专注于用
户界面和交互设计,从此两个领域的分工更加明晰。在这种趋势下, 设
计将成为服务器端程序员的必修课。然而,正如简单的 语言并不意味着高质
量的 程序,简单的 协议也不意味着高质量的 。要想设计出高
质量的 ,还需要深入理解分布式系统及 协议的特性。
幂等性定义
本文所要探讨的正是 协议涉及到的一种重要性质:幂等性
!"#$%&。在 '(( 规范中幂等性的定义是:
)$"%$))$*$+"#$%+%)!"
$#$$,$%&)"-.$/0"%
1)#$%21
从定义上看, 方法的幂等性是指一次和多次请求某一个资源应该具有同样的
副作用。幂等性属于语义范畴,正如编译器只能帮助检查语法错误一样, 规
范也没有办法通过消息格式等语法手段来定义它,这可能是它不太受到重视的原因
之一。但实际上,幂等性是分布式系统设计中十分重要的概念,而 的分布式
本质也决定了它在 中具有重要地位。
分布式事务 vs 幂等设计
为什么需要幂等性呢?我们先从一个例子说起,假设有一个从账户取钱的远程
(可以是 的,也可以不是),我们暂时用类函数的方式记为:
$$3)"3!$%4"5#$%&
3)"3 的语义是从 $%4" 对应的账户中扣除 #$% 数额的钱;如果扣
除成功则返回 ,账户余额减少 #$%;如果扣除失败则返回 ,账户余
额不变。值得注意的是:和本地环境相比,我们不能轻易假设分布式环境的可靠性。
一种典型的情况是 3)"3 请求已经被服务器端正确处理,但服务器端的返回结
果由于网络等原因被掉丢了,导致客户端无法得知处理结果。如果是在网页上,一