知识卡片

可用性定义的精确化:合理响应不等于正确响应

普通读书笔记卡

内容

可用性(Availability)的定义同样经历了精确化的过程。第一版是”每个请求都能得到成功或者失败的响应”(Every request gets a response on success/failure),第二版改为”非故障节点在合理时间内返回合理响应(不是错误或超时)”(A non-failing node will return a reasonable response within a reasonable amount of time (no error or timeout))。第一处差异是”every request”变成了”a non-failing node”——第一版没说清楚可用性的主语,实际上只有非故障节点才谈得上要满足可用性要求,如果节点本身已经故障了,发给它的请求本来就不一定能得到响应,笼统说”每个请求”是不严谨的。第二处差异更关键:第一版用”success/failure”来定义响应,这个标准太宽泛了——超时算失败、报错算失败、异常算失败、结果不正确也能算失败,几乎任何情况都能被归到”成功或失败”里,等于没有真正约束住什么才叫满足可用性;而第二版换成了两个”reasonable”——合理的响应、合理的时间,并且明确排除了错误和超时。这里有个容易被忽略但极其重要的细节:第二版说的是”合理”(reasonable)而不是”正确”(correct)——比如一个系统本该返回100,实际却返回了90,这依然可以是一个”合理”的响应(不是错误、不是超时、是个正常返回的数值),但它并不是一个”正确”的响应。这个区分正是理解CAP权衡的关键:可用性只保证”给出响应,且这个响应形式上说得通”,并不保证这个响应内容一定是当下最新、最准确的数据——这也是为什么可用性和一致性可以是两件独立的事,牺牲一致性换可用性时,系统依然能给出”合理但不是最新”的响应,而不是直接报错。

参考来源

- 位置:《从零开始学架构》第22讲《想成为架构师,你必须知道CAP理论》"可用性(Availability)"(源文件:_epub-src/OEBPS/text00002.html) - 结论依据:原文对比第一版"Every request gets a response on success/failure"与第二版"A non-failing node will return a reasonable response within a reasonable amount of time (no error or timeout)",说明"第一版的 success/failure 的定义太泛了……即使是成功的响应,也不一定是正确的。例如,本来应该返回 100,但实际上返回了 90,这就是成功的响应,但并没有得到正确的结果……第二版的解释明确了不能超时、不能出错,结果是合理的,注意没有说'正确'的结果",直接支撑本卡片结论。 - 原始内容:第一版的 success/failure 的定义太泛了……相比之下,第二版的解释明确了不能超时、不能出错,结果是合理的,注意没有说"正确"的结果。例如,应该返回 100 但实际上返回了 90,肯定是不正确的结果,但可以是一个合理的结果。