一致性与共识算法测试

共 18 题
📑 题目列表 18 题
#
★★★

1. 如何设计测试验证 Raft 集群在 Leader 切换时的线性一致性(Linearizability)?请说明测试用例构造方法和验证逻辑。

如何设计测试验证 Raft 集群在 Leader 切换时的线性一致性(Linearizability)?请说明测试用例构造方法和验证逻辑?

  • 线性一致性的定义与验证
  • Leader 切换场景的测试用例构造
  • 并发操作与线性化点验证

验证 Raft 在 Leader 切换时的线性一致性:1)测试用例构造——并发客户端同时对集群执行读/写操作(如注册、读注册值),在操作期间注入 Leader 切换(kill 当前 leader、触发选举);2)设计"注册器"(register)测试:客户端并发执行 write(key,value) 与 read(key),记录每个操作的时间戳与结果;3)验证逻辑——用线性一致性检查工具(Jepsen/porcupine/elle)分析操作历史:是否存在合法的线性化点顺序,使每个读操作返回"该时刻之后已提交写"的值;关键验证点:Leader 切换期间,写操作要么在旧 leader 完成,要么在新 leader 重放,不能出现"新 leader 接受但旧 leader 已提交"的冲突(Raft 通过新 leader 的 term 与新日志保证不覆盖已提交日志);4)验证"已提交的写不会被丢失"(Leader 切换后读到的值不含已提交写入的旧值)。用 Jepsen 的 checker 验证线性化,确保 Leader 切换不破坏一致性。

线性一致性验证的核心是"操作历史存在合法线性化顺序"。Leader 切换是 Raft 最容易破坏一致性的场景,需验证已提交写不丢失、读不读到过期值、选举不产生双主。

// Raft Leader 切换线性一致性测试伪代码
// 并发执行 read/write 并通过 elle/porcupine 验证线性化点
List<History> history = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    history.add(concurrentWriteRead("key" + i));   // 并发读写
}
ChaosStrike.killLeader(raftCluster);               // 触发 Leader 切换
// 再执行一轮读写,验证切换后不丢已提交写、不读到过期值
history.add(concurrentWriteRead("key" + i));
assertTrue(LinearizabilityChecker.check(history)); // 存在合法线性化顺序
#
★★

2. Jepsen 测试框架的核心方法论是什么?如何构造网络分区(Network Partition)故障来检验分布式系统的一致性协议?

Jepsen 测试框架的核心方法论是什么?如何构造网络分区(Network Partition)故障来检验分布式系统的一致性协议?

  • Jepsen 的核心方法论
  • 网络分区故障的构造
  • 一致性协议在故障下的验证

Jepsen 核心方法论:1)用可控的故障注入(网络分区、进程崩溃、时钟漂移)在分布式系统上并发执行操作,收集完整的操作历史;2)用严格的检查器(如 elle/porcupine 的线性一致性检查)验证操作历史是否符合系统声明的一致性(线性一致性、顺序一致性、因果一致性);3)通过"并发操作 + 故障注入 + 历史验证"发现系统在特定故障下的一致性违规。构造网络分区:用 iptables/分流工具将节点分成多组,阻断组间通信(保持组内连通),形成分区;在分区期间执行并发读写,观察系统行为(是否继续可用、是否产生不一致读);恢复分区后验证收敛。Jepsen 以"黑盒 + 故障注入 + 历史验证"为核心,检验系统在真实网络故障下的一致性承诺。

Jepsen 的核心是"故障注入制造并发历史,检查器验证一致性"。网络分区是制造"瞬间不一致"的最有效故障,能暴露系统在分区期间与恢复后的行为是否符合承诺。

#
★★

3. CAP 定理在测试设计中如何指导取舍?如何验证一个系统在网络分区下的行为符合其一致性声明?

CAP 定理在测试设计中如何指导取舍?如何验证一个系统在网络分区下的行为符合其一致性声明?

  • CAP 定理的取舍
  • 网络分区下的行为验证
  • 一致性声明与系统行为的匹配

CAP 定理:网络分区时,系统在一致性(C)与可用性(A)之间必须取舍。测试设计指导:1)明确系统声明(CP 系统:分区时拒绝写入保证一致;AP 系统:分区时继续可用但暂不一致);2)针对声明设计测试——CP 系统验证分区时少数派拒绝写入/返回错误、恢复后一致;AP 系统验证分区时仍可用、恢复后收敛(最终一致)。验证方法:1)构造网络分区;2)分区期间对两侧分别执行读写,观察行为(CP 系统应拒绝或返回错误,AP 系统应继续服务);3)验证分区期间的行为与声明一致(不出现"声称 CP 却返回不一致数据");4)恢复分区后验证收敛(数据最终一致)。测试的核心是"验证系统行为与它声明的一致性/可用性承诺一致"。

CAP 测试是"验证系统在分区下的取舍符合其声明"。测试者先明确系统声明,再构造分区验证行为匹配,避免"声明 CP 却分区下返回过期数据"的违约。

#
★★

4. 消息队列(Kafka/RocketMQ)的 Exactly-Once 与消息顺序性如何测试,重复消费、乱序与事务边界

消息队列(Kafka/RocketMQ)的 Exactly-Once 与消息顺序性如何测试:重复消费、乱序与事务边界?

  • Exactly-Once 消息语义的测试
  • 消息顺序性的测试
  • 重复消费与乱序的验证

测试 Exactly-Once:1)构造重复消费场景——消费者处理后提交 offset 失败/超时,导致重新拉取,验证通过幂等(去重表/幂等 key)保证不重复处理;2)验证生产端 Kafka 幂等生产者(enable.idempotence)在重试时不产生重复消息;3)验证生产者事务(Kafka transactions)与消费端事务(读已提交)保证原子写入。测试顺序性:1)发送有序消息(按 key 分区),验证同一 key 的消息按序消费;2)注入分区/重平衡,验证顺序不被打乱(同一分区内保序);3)验证乱序发生时的处理(延迟乱序、乱序缓冲)。事务边界:验证一组消息要么全部提交要么全部回滚,不出现部分提交。测试用"去重断言 + 顺序断言 + 事务原子性断言"。

Exactly-Once 依赖"幂等 + 事务",顺序性依赖"按 key 分区 + 分区内保序"。测试要验证重复消费被幂等拦截、乱序被正确缓冲、事务边界原子。

#
★★

5. 分布式快照(Chandy-Lamport 算法)在测试/验证中如何应用?如何验证全局状态的一致性?

分布式快照(Chandy-Lamport 算法)在测试/验证中如何应用?如何验证全局状态的一致性?

  • Chandy-Lamport 分布式快照的原理
  • 快照在测试中的应用
  • 全局状态一致性的验证

Chandy-Lamport 算法:通过 marker 消息协调各节点在无全局时钟下记录一致快照(局部状态 + 通道中在途消息),形成全局一致状态。测试应用:1)用分布式快照获取系统在某一时刻的全局状态,用于一致性检查(如各副本状态是否一致、消息在途状态);2)在故障注入(如网络分区)时用快照验证系统状态是否一致(快照可反映分区瞬间的全局状态);3)用于对账与恢复——通过快照对比各副本数据,验证最终一致性。验证全局状态一致性:1)对多个节点/副本执行快照,对比关键数据(记账余额、队列长度、状态机日志)是否一致;2)验证快照包含在途消息(不丢失也非重复);3)用快照验证崩溃恢复后系统能恢复到一致状态。全局一致性验证是分布式系统正确性的关键。

分布式快照在无全局时钟下提供"一致的状态视图",是验证全局一致性的工具。测试用它对比副本状态、验证在途消息与恢复一致性。

#
★★

6. 线性一致性与顺序一致性(Sequential Consistency)、因果一致性(Causal Consistency)的测试验证方法有何不同?

线性一致性与顺序一致性(Sequential Consistency)、因果一致性(Causal Consistency)的测试验证方法有何不同?

  • 三种一致性模型的定义
  • 各自验证方法的差异
  • 验证工具的适用性

线性一致性(Linearizability):所有操作在全局时间轴上有一个线性化点,读操作返回"该点之后已提交写"的值,要求最强(实时顺序)。验证用线性化检查器(Jepsen/porcupine/elle)检查操作历史是否存在合法线性化顺序。顺序一致性(Sequential Consistency):存在一个全局顺序,所有进程按该顺序执行,但不要求该顺序与实时时序一致(允许操作被重排)。验证需要检查是否存在一个满足所有进程观察到的全局顺序。因果一致性(Causal Consistency):只保证因果相关的操作(如"先写后读依赖")按因果顺序可见,并发无关操作可任意顺序。验证只需检查因果依赖关系是否被满足(构建 happens-before 图)。三者的验证强度递减:线性一致性最强(验证复杂),因果一致性最弱(验证相对简单)。验证方法差异在于检查的"约束强度":线性要求实时顺序,顺序要求全局顺序,因果只要求因果序。

三种一致性模型约束强度不同,验证方法强度也随之不同。线性一致性验证最严格(需实时顺序),因果一致性验证最宽松(只需因果序),测试方法要匹配模型。

#
★★

7. 共识算法测试中如何模拟拜占庭故障(Byzantine Fault)?与崩溃故障(Crash Fault)测试的差异?

共识算法测试中如何模拟拜占庭故障(Byzantine Fault)?与崩溃故障(Crash Fault)测试的差异?

  • 拜占庭故障的模拟方法
  • 拜占庭故障与崩溃故障的差异
  • 共识算法的容错要求

拜占庭故障模拟:1)模拟节点发送错误/恶意消息(篡改数据、伪造签名、发送矛盾消息、选择性丢消息);2)模拟节点延迟重发、重复发送不同内容;3)用故障注入框架(如 fault injection library)让节点在提交时返回错误结果或发送不一致消息。与崩溃故障(Crash Fault)差异:崩溃故障是节点"停止工作"(进程崩溃、无响应),故障行为可预测,可通过超时/多数派容忍;拜占庭故障是节点"行为异常/恶意"(发错误消息、伪造数据),更难检测,需要拜占庭容错算法(如 PBFT、HotStuff)在 f 个恶意节点下仍达成一致。测试差异:崩溃故障测试验证"节点不响应时多数派仍能提交";拜占庭故障测试验证"节点发送矛盾/错误消息时,算法仍能达成一致且结果正确"。拜占庭容错要求恶意节点数 f < n/3(对 PBFT 类)。

崩溃故障是"静默失败",拜占庭故障是"主动作恶"。测试差异在于故障模型不同:崩溃只需超时容忍,拜占庭需验证结果正确性且在恶意节点下达成一致。

#
★★

8. 分布式系统测试中的'确定性模拟(Deterministic Simulation)'方法及其优势?

分布式系统测试中的"确定性模拟(Deterministic Simulation)"方法及其优势是什么?

  • 确定性模拟的原理
  • 与传统测试的差异
  • 确定性模拟的优势

确定性模拟(Deterministic Simulation):在模拟器中控制所有不确定因素(网络消息顺序、时序、时钟、故障),使每次运行都产生确定性的调度顺序,从而让测试可复现。实现方式:1)模拟网络——消息延迟、丢失、乱序可控;2)模拟时钟——可任意调整/回拨;3)模拟故障——精确注入进程崩溃、网络分区;4)单线程调度——把所有并发的节点事件在单线程中虚拟化,由调度器决定顺序并记录。优势:1)可复现——同样的故障注入与调度产生相同结果,Bug 可稳定复现;2)可穷举——系统化探索不同调度顺序(如随机化/模糊测试调度),覆盖并发时序;3)快速——无需真实网络与分布式部署,可快速运行大量场景;4)能定位——通过记录调度序列精确定位 Bug 触发条件。FoundationDB、TigerBeetle 用此方法大幅提升分布式系统测试能力。

确定性模拟把"不可控的并发与故障"变成"可控的调度",从而可复现、可穷举、可精确定位。这是分布式测试相对传统测试的巨大优势。

#
★★

9. 分布式锁的故障场景测试,租约过期、锁被误删、脑裂与重入如何构造并验证

分布式锁的故障场景测试:租约过期、锁被误删、脑裂与重入如何构造并验证?

  • 分布式锁的故障场景(租约过期、误删、脑裂、重入)
  • 各故障场景的构造方法
  • 锁安全性验证

分布式锁故障场景测试:1)租约过期——模拟锁持有者处理超时(暂停/延迟),租约过期后锁被其他节点获取,验证原持有者释放操作不能误删新持有者的锁(用 value/token 校验);2)锁被误删——模拟持有者因延迟在租约过期后释放,若用无条件 DEL 会误删新锁,验证"带 token 的条件删除"(compare-and-delete)能防止误删;3)脑裂——模拟网络分区,验证分区两侧不会同时持锁(需多数派仲裁/锁服务端一致性);4)重入——同一线程/进程重复获取锁,验证可重入锁计数正确,释放次数匹配。验证要点:锁必须保证"互斥性"(同一时刻仅一个持有者)与"安全性"(过期后不误删新锁)。用 Redisson 的看门狗(watchdog)续租、带 UUID 的锁值、条件删除等机制确保安全。

分布式锁的经典故障是"持有者延迟导致租约过期,释放时误删他人锁"。测试要构造这些场景并验证互斥与安全删除,token 校验是核心。

// 验证分布式锁的条件删除(防误删)
String lockValue = UUID.randomUUID().toString();
boolean locked = redis.setIfAbsent("lock:key", lockValue, 30, TimeUnit.SECONDS);
// ... 处理逻辑超时,租约过期,其他节点获取锁 ...
// 释放时用 Lua 脚本做条件删除,仅当 value 匹配才删除
boolean released = redis.eval("if redis.call('get',KEYS[1])==ARGV[1] then " +
    "return redis.call('del',KEYS[1]) else return 0 end",
    "lock:key", lockValue) == 1L;
assertTrue(released, "只有持有者才能删除锁,避免误删新锁");
#
★★

10. 最终一致性系统的对账测试,异步复制延迟下的读写一致性验证与补偿机制测试

最终一致性系统的对账测试:异步复制延迟下的读写一致性验证与补偿机制测试是什么?

  • 最终一致性与异步复制延迟
  • 读写一致性的验证
  • 对账与补偿机制的测试

最终一致性对账测试:1)读写一致性验证——在异步复制延迟下,写入主库后立即读可能读到旧值(暂不一致),验证"读己之写"在特定条件下是否满足,以及最终收敛到一致;2)对账测试——设计对账任务,对比主库与从库/多个副本的数据,验证延迟结束后数据一致(无差异或差异被修正);3)补偿机制测试——注入复制失败/延迟,验证补偿机制(重试、告警、人工修复)按预期触发,最终数据一致;4)验证"最终一致"的收敛时间——在可接受延迟窗口内数据一致;5)验证冲突处理——并发写不同副本产生的冲突能被正确合并(如 LWW、版本向量)。测试断言:最终一致系统在延迟后数据一致、对账能发现并修复差异、补偿机制正确处理故障。

最终一致性测试的重点是"读可能读到旧值,但最终一致 + 对账可发现修复差异 + 补偿兜底"。验证最终收敛、对账有效性、补偿机制。

#
★★

11. 缓存与数据库一致性(双写、延迟双删、Binlog 订阅)的测试方法,如何构造并发读写场景验证最终一致?

缓存与数据库一致性(双写、延迟双删、Binlog 订阅)的测试方法:如何构造并发读写场景验证最终一致?

  • 缓存与数据库一致性的方案(双写、延迟双删、Binlog 订阅)
  • 并发读写场景的构造
  • 最终一致性的验证

缓存与数据库一致性测试方法:1)双写方案——写操作同时更新数据库与缓存,验证并发下不一致(如先写库后写缓存失败导致缓存旧值);2)延迟双删——先删缓存,再更新库,延迟后再删缓存,验证"延迟窗口内读到的旧值"能最终被清除、缓存最终一致;3)Binlog 订阅——通过订阅数据库 Binlog 异步更新缓存,验证 Binlog 消费延迟下缓存短暂不一致、最终一致,以及消费失败重试。构造并发读写:并发线程执行"写库+更新缓存"与"读缓存"交叉,记录是否读到过期值;验证最终一致:断言在足够延迟后,缓存与数据库一致(无过期值残留)。测试要覆盖"并发下读可能读到旧值,但最终一致,且不一致窗口可控"。

缓存一致性测试的核心是"验证不一致窗口内的行为可接受 + 最终一致收敛"。并发读写交叉验证,断言最终一致与不一致窗口。延迟双删、Binlog 订阅都是缩小不一致窗口的手段。

#
★★

12. 时钟与一致性,逻辑时钟与混合逻辑时钟在一致性判断中的作用,时钟回拨如何影响一致性测试结果?

时钟与一致性:逻辑时钟与混合逻辑时钟在一致性判断中的作用,时钟回拨如何影响一致性测试结果?

  • 逻辑时钟与混合逻辑时钟的作用
  • 时钟回拨对一致性的影响
  • 时钟相关测试的构造

逻辑时钟(Lamport 时钟):用计数器 + 消息传递维护"事件发生顺序"(happens-before),不依赖物理时钟,用于排序事件与因果判断。向量时钟(Vector Clock)扩展了 Lamport 时钟,能检测并发冲突。混合逻辑时钟(HLC):结合物理时钟与逻辑时钟,即接近物理时间又保持因果序,用于分布式数据库/事件排序。时钟回拨影响:1)物理时钟回拨会导致依赖时间戳排序的逻辑出错(如 TTL 判断、租约、消息排序);2)若系统用物理时钟做时间戳,回拨会让新事件时间戳小于旧事件,破坏一致性判断;3)HLC 对回拨有容忍(用逻辑组件补偿),但物理时钟大幅回拨仍可能出问题。测试构造:用时钟模拟工具(libfaketime、NTP 模拟)注入回拨,验证:时间戳排序仍正确、租约/TTL 判断正确、依赖逻辑时钟的系统不受物理回拨影响。

逻辑时钟解决"物理时钟不可靠"下的因果排序;时钟回拨是物理时钟的典型故障,测试需验证系统对回拨的容忍(HLC 补偿)或依赖逻辑时钟不受影响。

#
★★

13. 分布式 ID 的一致性测试,全局唯一 ID 生成在时钟回拨、并发与节点重启场景下的唯一性与单调性如何验证?

分布式 ID 的一致性测试:全局唯一 ID 生成在时钟回拨、并发与节点重启场景下的唯一性与单调性如何验证?

  • 分布式 ID 生成方案(雪花算法等)
  • 唯一性与单调性的验证
  • 时钟回拨、并发、重启场景

分布式 ID 测试:1)唯一性——大量并发生成 ID,验证无重复(用去重集合/数据库断言);2)单调性——验证 ID 随时间单调递增(后续 ID > 之前 ID);3)时钟回拨——雪花算法用时间戳+节点+序列号,时钟回拨会导致 ID 变小/重复,验证回拨时的处理(等待/拒绝/序列号补偿);4)并发——多节点/多线程并发生成,验证节点 ID 隔离 + 序列号不冲突;5)节点重启——重启后节点 ID 不变、序列号不重复,验证不产生重复 ID。验证方法:并发生成大量 ID 检查唯一性、检查单调性、注入时钟回拨验证不重复不倒退、重启节点验证不冲突。测试断言:全量唯一、单调递增、回拨不重复、重启不冲突。

分布式 ID 的核心约束是"全局唯一 + 尽量单调"。时钟回拨是雪花算法的最大风险,测试要验证回拨时 ID 不重复、不倒退,并验证并发与重启下的唯一性。

#

14. 分布式事务(2PC/3PC/Saga)的测试策略,如何验证在各种故障点下的事务原子性和一致性?

分布式事务(2PC/3PC/Saga)的测试策略:如何验证在各种故障点下的事务原子性和一致性?

  • 分布式事务方案(2PC/3PC/Saga)
  • 故障点的构造
  • 原子性与一致性的验证

分布式事务测试策略:1)2PC(两阶段提交)——验证在 prepare 阶段、commit 阶段、协调者故障、参与者故障等各故障点下,事务要么全部提交要么全部回滚(原子性);2)3PC——验证增加的超时与恢复阶段,减少阻塞;3)Saga——验证长事务拆分为多个本地事务 + 补偿,验证各步骤失败时补偿操作正确执行(逆向补偿),最终一致性;4)故障点覆盖——协调者崩溃、参与者崩溃、网络分区、消息丢失、超时;5)验证——用故障注入在各故障点中断事务,验证:2PC 无部分提交(原子)、Saga 补偿完整执行(最终一致)、无悬挂事务。测试断言:任何故障点下,要么全提交要么全回滚(2PC),或补偿正确完成(Saga)。

分布式事务测试要覆盖"各故障点下的事务原子性/一致性"。2PC 验证原子性,Saga 验证补偿与最终一致,故障注入是核心手段。

#

15. 一致性测试的边界,业务可接受?

一致性测试的边界:业务可接受的一致性水平是什么?

  • 一致性测试的边界
  • 业务可接受的一致性水平
  • 一致性模型与业务需求的匹配

一致性测试的边界是指"测试到什么程度的一致性即可满足业务需要",而非追求绝对最强一致性。业务可接受的一致性水平因业务而异:1)强一致业务(支付、转账、库存扣减)——需线性一致性/强一致,测试要求严格;2)最终一致业务(评论、通知、统计)——可接受短暂不一致,测试验证最终收敛与不一致窗口可接受;3)会话级一致(读己之写)——保证用户自己写的数据可见,测试验证该约束。测试边界原则:1)根据业务需求选择一致性模型,不盲目追求最强;2)验证"业务可接受的不一致窗口"内数据可用、最终一致;3)测试要验证"不一致是否在业务容忍范围内"(如订单金额不一致不可接受,评论延迟可接受)。一致性测试的边界 = 业务需求 + 一致性模型 + 可接受的不一致窗口。

一致性测试不是"越强越好",而是"匹配业务需求"。测试边界由业务容忍度决定,要验证不一致窗口在业务可接受范围内。

#

16. 一致性测试的报告,如何呈现与决策?

一致性测试的报告:如何呈现与决策?

  • 一致性测试报告的呈现方式
  • 报告驱动的决策
  • 一致性测试结果的解读

一致性测试报告呈现:1)结果概览——测试了哪些一致性模型、哪些故障场景、通过/失败;2)一致性违规的具体证据——操作历史、时间线、违规点(哪个操作在哪个时刻读到错误值);3)故障场景覆盖矩阵——网络分区、节点宕机、时钟回拨等场景下的表现;4)收敛时间——最终一致系统达到一致所需时间;5)对比说明——系统声明的一致性与实际行为的一致性。决策:1)报告用于判断系统是否满足业务一致性需求(通过则上线,违规则修复);2)定位违规点指导修复(是算法缺陷、配置错误还是故障处理缺失);3)风险量化——量化不一致窗口与影响范围,决定是否接受或整改。报告要"结论明确、证据充分、可追溯"。

一致性测试报告要呈现"违规证据 + 场景覆盖 + 收敛时间",让决策者判断系统一致性与业务需求的匹配度,并指导修复。

#

17. 注册中心/配置中心的分布式一致性测试,服务发现延迟、配置推送丢失与节点故障的用例设计?

注册中心/配置中心的分布式一致性测试:服务发现延迟、配置推送丢失与节点故障的用例设计?

  • 注册中心/配置中心的测试用例
  • 服务发现延迟、配置推送丢失、节点故障
  • 一致性验证

测试用例设计:1)服务发现——服务注册/注销后,验证其他服务在可接受延迟内发现或摘除(服务发现延迟);验证注册中心节点故障时服务发现仍可用(高可用);2)配置推送——配置变更后,验证配置中心能推送到所有订阅方(无丢失);验证推送失败时重试与补偿,配置在客户端最终一致;验证配置版本一致性(老客户端不读到新配置的错乱);3)节点故障——注册中心集群节点故障时,验证服务发现与配置推送不中断(多数派存活)、故障恢复后数据一致(同步)。验证要点:服务发现延迟在可接受范围、配置推送不丢失(最终一致)、节点故障不影响可用性。用故障注入(kill 节点、模拟推送失败、网络延迟)覆盖这些场景。

注册中心/配置中心一致性测试围绕"服务发现时效、配置推送不丢失、节点故障可用性"。验证延迟可接受、推送最终一致、故障高可用。

#

18. 会话级一致性测试,读己之写、单调读与因果读等客户端可见性保证如何设计多会话用例验证?

会话级一致性测试:读己之写、单调读与因果读等客户端可见性保证如何设计多会话用例验证?

  • 会话级一致性模型(读己之写、单调读、因果读)
  • 多会话用例设计
  • 可见性保证的验证

会话级一致性测试:1)读己之写(Read-your-writes)——同一会话写入后,验证随后的读能读到该写(即使写未传播到所有副本);用例:客户端写后立即读,验证读到新值;2)单调读(Monotonic Read)——同一会话后续读不读到更旧的值;用例:多次读同一 key,验证读到的值不倒退;3)因果读(Causal Read)——因果相关的操作按因果顺序可见;用例:写 A 后因果写 B,验证读到的顺序符合因果。多会话用例:创建多个会话(客户端),不同会话执行不同操作,验证各会话的可见性保证;注入副本延迟/分区,验证会话内一致性仍满足(写己之读)。验证断言:会话内读答到已写值、读值不倒退、因果序正确。

会话级一致性是"宽松但客户端可感知"的一致性保证。多会话用例验证"同一会话的可见性承诺",注入副本延迟验证会话内不变性。