三个属性
- 一致性(C) — 每次读取都看到最近写入或返回错误,即线性化含义。
- 可用性(A) — 每个发往非故障节点的请求都收到非错误响应,但不保证包含最新写入。
- 分区容忍(P) — 节点间消息丢失或延迟时系统仍继续运行。
网络分区期间,节点无法同时保证最新值和响应所有请求:要么拒绝部分请求以保持一致,要么返回可能陈旧的数据以保持可用。
工程师实际选择什么
发生分区
├── 拒绝无法保持一致的读写 -> CP 行为
└── 提供可能陈旧的数据 -> AP 行为
支付账本可能对扣款选择 CP;商品信息流可能选择 AP 并稍后对账。选择可以按端点,而不是按数据库。
何时使用这个视角
在设计故障行为时使用 CAP:副本无法通信时系统应该怎么做?与 PACELC 相比,CAP 忽略正常运行时延迟与一致性的取舍;PACELC 用 else 分支补上这一分析。与 ACID 相比,CAP 关注分区期间的分布式复制,而不是单节点事务保证。
陷阱
CAP 标签不能说明系统是否支持读己之写、收敛需要多久或冲突写入如何处理。应直接测试分区行为或阅读厂商的一致性文档。不要用 CAP 宣称某个数据库普遍优于另一个。