Appearance
第2章:逻辑时钟与一致性模型
先发生关系
同一进程中的程序顺序、消息发送先于接收,以及它们的传递闭包,定义 happens-before。没有先发生关系的两个事件是并发事件,这不要求它们在物理时间上恰好同时。
Lamport 时钟在本地事件时递增,接收消息时先取本地与消息时间戳的最大值再递增。若 ,则 ;反过来不成立,数值先后可能只是人为安排的顺序。
向量时钟记录各进程已知的进度,在标准固定成员模型中可更准确表达因果偏序,但元数据随成员数增加,并需要处理成员变化。
线性一致性
线性一致性要求每次操作看起来在调用与返回之间某一瞬间生效,并形成遵守实时先后的合法顺序。
初值为 0,写入 1 已返回后才开始的读取,在没有其他写入时必须返回 1。若读与写重叠,返回 0 或 1 都可能符合线性一致性,取决于选定的线性化点。
顺序一致性只要求保持每个客户端的程序顺序,不必保持不同客户端间全部实时先后。最终一致性通常承诺在停止更新、通信与修复持续进行等条件下副本收敛,不承诺此刻读到最新值。
CAP 的具体含义
在可能分区的异步网络中,无法同时保证线性一致性和“非故障节点收到的每个请求最终都响应”的可用性。
两个副本被分区,A 接受并完成写入 1,之后 B 收到读取。B 无法获知该写入,却必须在可用性要求下回复;返回旧值会破坏线性一致性,等待分区恢复则不满足上述可用性。这里的可用性是形式定义,不等同于营销中的全年在线率。
可串行化与线性一致性
可串行化针对事务历史能否等价于某串行顺序;线性一致性通常针对对象操作并包含实时顺序。严格可串行化把事务串行化与实时要求结合。
一个系统的单键读写线性一致,不自动意味着跨多个键的事务严格可串行化。
练习
- 构造 Lamport 时间戳有序但事件并发的执行。
- 给一个与写重叠的读分配两种合法线性化点。
- 为什么 CAP 不能简化为任意场景下“从三个功能选两个”?