知识卡片
Eureka与Consul的AP/CP权衡取决于分区后各自能否独立正确服务
内容
[[注册中心因系统地位特殊而同时需要高可用与高可靠]]的矛盾在具体产品上 体现为两种不同选择。Eureka选AP:节点间异步复制注册信息,新服务注册后 立即在当前节点可见,不等其他节点同步完成;下线的服务靠超时机制清理, 不实时广播。哪怕整个注册中心崩溃,客户端仍能凭本地缓存(靠TTL机制更新) 维持最低限度可用——Eureka敢这样选的底气在于Netflix OSS全家桶里还有 Ribbon、Hystrix兜底做故障转移/快速失败,即使拿到错误地址也不至于整个 调用链崩掉。Consul选CP:基于Raft算法,要求多数节点写入成功服务变更 才算完成,同时用Gossip支持跨数据中心的更大规模同步——Consul这样选也是 现实使然,它不像Netflix OSS那样有配套组件兜底,一旦拿到错误地址就没有 退路。判断该选哪种,作者给出一个具体的检验问题:假设系统被网络分区成 A、B两个区,A区服务只能发现A区坐标、B区只能发现B区坐标,这对系统有多 大影响?如果分区后各分区依然能各自独立、正确地提供完整服务(如恰好是 按机房划分的分区,分区反而避免了跨机房调用、变相优化了链路),就该选 AP;如果系统重度依赖集中式缓存/消息总线等有状态服务、分区会直接破坏 业务正确性,那么”停机”比”数据错误”更可接受,应该选CP。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第7章"从类库到服务"
7.1.2节"可用与可靠"(源文件:_epub-src对应OEBPS/Text/chapter86.xhtml)
- 结论依据:原文详述Eureka异步复制+TTL缓存换高可用、依赖Ribbon/Hystrix
兜底,Consul基于Raft多数派写入换一致性、缺乏配套兜底组件,并给出"分区
后各分区能否独立正确服务"这一判断标准,直接支撑本卡片结论。
- 原始内容:Eureka的选择是优先保证高可用性,相对牺牲系统中服务状态的
一致性……Consul的选择是优先保证高可靠性,相对牺牲系统服务发现的可用
性……假设系统形成了A、B两个网络分区后……这对你的系统会有什么影响?