首页/数据/NoSQL 速查/CAP 与 PACELC 基本判断
选型与架构50 条

CAP 与 PACELC 基本判断

CAP 指出网络分区发生时只能在一致性与可用性之间取舍;PACELC 补充正常运行时还要在延迟与一致性间取舍。分布式系统分区难以避免,选型实际是在"C 优先还是 A 优先"上做决定。

NoSQL 速查数据更新于 2026-10-13

CAP 在说什么

CAP 指出网络分区发生时,系统只能在一致性与可用性之间取舍:要保证所有节点读到相同数据,就得拒绝部分请求;要保证每个请求都有响应,就可能读到旧数据。分区在跨机房部署里难以避免,所以选型的实质是决定一致性优先还是可用性优先。

PACELC 补上了平时的情况

PACELC 把问题分成两半:发生分区时在可用性与一致性之间选,其余时间则在延迟与一致性之间选。写确认级别、读偏好、刷新间隔这些具体参数,就是抽象取舍落到配置上的旋钮。

基本信息

C 一致性所有节点读到相同数据,常见于强一致主从架构与共识协议
A 可用性每个请求都能得到响应,但不保证最新
P 分区容忍部分节点失联时系统仍能运转,跨机房部署的必选项
PACELC有分区时选可用或一致,无分区时选低延迟或强一致
落地方式写确认级别、读偏好、刷新间隔等具体参数

取舍落到配置

取舍落到配置
强一致倾向:写确认多数派 + 读确认多数派
低延迟倾向:从副本读、近实时读、多活最终一致

# 示例:写入要求多数派确认
db.orders.insertOne({ sku: "A-1" }, { writeConcern: { w: "majority" } })

# 示例:读偏好设为从副本读,接受轻微旧读
db.orders.find({}).readPref("secondaryPreferred")

# 检索层同理:刷新间隔越短,可见性越快、写入开销越高

典型使用场景

  • 跨机房架构评审:明确分区时宁可拒绝写还是接受旧读
  • 数据库选型:按业务对一致性的要求筛选候选方案
  • 参数默认值评审:写确认与读偏好往往决定真实体验
  • 故障预案:分区持续期间的降级策略与恢复后的数据核对
  • 沟通对齐:把理论取舍翻译成业务能理解的丢数或旧读窗口

场景与取舍倾向

场景取舍倾向常见做法
支付与账务一致性优先多数派写确认,读主节点
内容与搜索可用性优先近实时读,最终一致
会话与缓存可用性优先允许短暂旧值,靠过期时间收敛
跨机房同步按业务分层关键数据强一致,其余异步
把抽象理论落到配置上才有意义:先明确业务能接受多大延迟与多长的旧读窗口,再决定写确认与读偏好参数,而不是照抄默认值。
把 CAP 当成"三选二"、认为可以主动放弃分区容忍,会让跨机房设计失去前提;分区不是可选设计项,而是必须应对的常态。

易错点

  • 把 CAP 当成三选二、认为可以同时放弃分区容忍,会让跨机房设计失去前提
  • 一致性讨论只停留在架构图,真正影响体验的是写确认与读偏好这些默认配置
  • 只在故障后才讨论降级策略,缺少预案时分区期间容易出现超时与请求堆积
  • 认为强一致就没有旧读,忽略缓存与副本读引入的延迟窗口

数据来源与参考

  • MongoDB Manual: Read Concern
  • Elasticsearch Guide: Near real-time search
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌