SWE / SRE / Frontend · System Design / 基础

TikTok CAP:网络分区时到底牺牲什么

用具体读写执行解释一致性和可用性的冲突,不把 CAP 当三个产品标签。

题目重点:用具体读写执行解释一致性和可用性的冲突,不把 CAP 当三个产品标签。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 讨论分区模型下的线性一致性与每个非故障节点请求终止的可用性;不混同数据库ACID。

解题路线

  1. 两个副本之间网络断开,客户端分别访问两侧。如果双方都立即接受不协调写并读本地值,可能无法表现为单一实时顺序。
  2. 为了线性一致,一侧或不能形成所需协调的请求要等待/拒绝;为了分区期间双方继续服务,允许陈旧与冲突,需要后续合并。
  3. P不是正常网络永不坏的开关,而是需要应对的故障条件。没有分区时仍有延迟与一致性权衡,CAP不提供完整性能模型。
  4. 按操作选择合同:余额扣减与配置读取风险不同,同系统可对部分请求拒绝、部分读缓存;说明陈旧上界/冲突政策。

手动走一遍

写A=1完成后,断开侧B读取0,若读发生在完成后且应线性一致,该执行不满足合同。多数侧继续写、少数侧拒绝可维护规定一致性,但少数侧请求不是CAP定义的全可用。

规模与取舍

不输出统一复杂度;跨区域协调带来网络延迟与故障等待,必须对业务操作给出SLO和降级合同。

易错点与追问

容易失分的边界

  • 三选二用于所有正常运行情况。
  • availability等于99.99%SLA。
  • CAP的C等于所有ACID约束。

继续深挖

  • 分区恢复如何修复冲突?
  • 为什么只谈CAP不足解释正常时的读延迟?
✓已复制微信号!