CAP 和 BASE 是什么?为什么不能简单理解成“三选二”?
🧑💻 面试官:CAP 是什么?
🙋♂️ 我:一致性、可用性和分区容错,三个选两个。
🧑💻 面试官:真实系统可以选择网络永远不分区吗?
🙋♂️ 我:不能,分区发生时要做取舍。
🧑💻 面试官:那回一个错误算保证了可用吗?最终一致是不是等一等就自然一样?
CAP 讨论分区下的保证,BASE 描述一种设计取向;都不能替你写出冲突恢复规则。
面试速答(60 秒版)
CAP 在其模型下说明:发生网络分区时,不能同时保证线性一致性和对所有非故障节点请求的可用性。这里的 C 不是泛指数据不出错,A 也不是服务每月可用率。
不能把它理解为平时随意从三个按钮选两个。分区期间有的操作必须等待或拒绝,有的可以接受暂时旧值,取决于具体数据与约束。
BASE 通常指基本可用、软状态、最终一致,是设计思路,不是另一个自动达成的定理。最终一致需要传播、重试、冲突处理与收敛条件。
我会按操作定义允许的旧值、等待时间和恢复方式,而不是给整个系统贴一个 CP 或 AP 标签就结束。

知识点详解:两边暂时联系不上,系统还能答应什么
先用一份共享配置观察分区
假设两个机房共享某个配置值。A 机房完成修改,随后 B 收到读取请求,但它联系不到 A,也没有收到新值。
B 若直接返回旧值,可以继续服务,却不满足这里要求的最新读写顺序;若要守住这个顺序,就不能无条件完成这次读取。
这是针对共享数据和故障模型的判断。返回一个错误页面不等于完成了读写数据对象的可用性保证。
CAP 的词,和日常术语不完全一样
C 在相关定理中是线性一致性:操作看起来有一个符合实际先后关系的统一顺序。它和 ACID 中维护数据库规则的“一致性”不能直接划等号。
A 是模型里的请求完成保证,不是监控上的 99.9% SLA。P 则是面对节点间消息无法正常传递的情况,不是你可以靠愿望关掉的开关。
没有分区时也要考虑延迟与协调成本,但不能把所有性能权衡都叫 CAP 证明。
BASE 不表示业务规则可以先不管
假设文章浏览量允许稍后汇总,可以先各自累计,再通过定义好的机制合并。这个方向可以接受暂时不同的显示结果。
但如果某个权限已被撤销,是否还允许旧副本授权,就需要另外判断。不同数据不必采用相同容忍度。
最终一致要有条件:更新停止后,传播和冲突处理能让副本收敛。消息永远丢失、冲突没有规则,等待多久都不会自动变正确。
把取舍写成分区与恢复两份约定
分区期间,哪些读取可用旧值、哪些写入必须拒绝、是否能先记录待处理意图,都要明确。界面不能把“已受理”显示成“已经生效”。
恢复之后,要补发遗漏更新、去重、处理冲突,并检查不变量。需要人工处理的差异也应有入口,不能只让日志不断报错。
面试选型可以从一个具体操作回答,再扩展到模块,不必追求整个产品只有一种标签。
本题机制参考:Gilbert 与 Lynch CAP 论文、Brewer 十二年回顾。
面试官继续追问
CP 就意味着系统一直不可用吗?
不是,讨论的是相关故障下部分操作的保证;正常状态仍可以提供服务。
最终一致有没有规定几秒?
术语本身没有统一秒数。产品若承诺收敛时限,需要额外机制和测试。
ACID 和 BASE 必须全系统二选一吗?
不是。局部数据库事务和跨模块异步收敛可以共存,边界需要说明。
面试速记卡
- CAP:分区下的保证冲突,不是随时三选二。
- C:线性一致性;不要直接等同 ACID 的 C。
- A:请求完成保证;不要等同 SLA 百分比。
- BASE:设计取向,不自动修复冲突。
- 工程:逐操作定义分区行为和恢复规则。
公司面试真题
真题根据求职者公开面经整理,题意经过概括,非逐字原话或公司官方题库;本文为 Sunday 的独立解析。
美团 · 后端(榛果民宿) · 原帖未明确批次
Nacos 的 AP 与 CP 在具体场景中如何选择?(题意整理)
美团offer call还愿 ↗
历史面经;原帖编辑于 2019-09-18