知识卡片

安全属性不可撤销与活性属性终将实现的区分帮助推理算法正确性

普通读书笔记卡

内容

定义一个分布式算法”正确”,需要写清楚它应该满足的性质——就像”排序算法正确”可以定义 成”输出列表里任意两个相邻元素左边不大于右边”一样。以[[防护令牌用递增编号让资源方 拒绝过期天选者的写入]]为例,可以写出三条性质:唯一性(不会有两个请求返回同一个令牌)、 单调序列(如果请求x在请求y开始前已完成,那么x拿到的令牌一定小于y拿到的)、可用性 (一个正常发出令牌请求且没崩溃的节点,最终会收到响应)。这三条性质分属两类不同的 属性,理解这个区分是判断”在特定系统模型下这个算法到底能不能兑现承诺”的关键工具。 唯一性和单调序列是安全属性:安全属性的通俗理解是”没有坏事发生”,其精确特征是——一旦 被违反,你能明确指出违反发生的那个具体时刻(比如某次操作返回了重复令牌),而且这个 违反是不可撤销的,损失已经真实发生了,无法在未来被”挽回”。可用性是活性属性:活性 属性的通俗理解是”最终会有好事发生”,其判断标准是——在某个时刻它可能还不成立(比如 请求发出去了但还没收到响应),但总归希望未来某一刻能成立;活性属性的定义里经常出现 “最终”这个词(对,最终一致性就是一种活性属性)。区分两者的实际价值在于:对安全属性, 分布式算法通常要求在系统模型允许的所有可能情形下都始终成立(哪怕所有节点崩溃、整个 网络故障,算法也绝不能返回错误结果);而活性属性可以附带一些前提条件(比如”只要 大多数节点没崩溃”“只要网络最终恢复”),不需要无条件保证——这让原本看似”任何情况下 都要保证一切”的不可能目标,被拆解成”安全性绝不能违反、活性性只在合理前提下承诺”这个 更现实可行的设计原则。

参考来源

- 位置:《数据密集型应用系统设计》第八章《分布式系统的麻烦》"算法的正确性""安全性 和活性"(源文件:_epub-src/ch8_split_005.html) - 结论依据:原文以防护令牌的唯一性/单调序列/可用性三条性质为例,区分安全属性(一旦 违反可指明具体时刻且不可撤销)与活性属性(可能暂不成立但最终应成立,常含"最终" 一词),并说明安全属性通常要求无条件始终成立、活性属性可附带前提条件,直接支撑 本卡片结论。 - 原始内容:唯一性和单调序列是安全属性,而可用性是活性属性……安全通常被非正式地 定义为:没有坏事发生,而活性通常就类似:最终好事发生……违反安全属性后,违规行为 不能被撤销——损失已经发生……活性属性反过来:在某个时间点……它可能不成立,但总是 希望在未来能成立。