知识卡片

三类注册中心实现方案在透明度与CAP归属上的取舍

普通读书笔记卡

内容

实现服务发现有三条不同路线,各自的CAP归属和对应用的透明程度不同。基于 分布式K/V框架自建(ZooKeeper、etcd):这些框架本身自带共识算法(etcd用 Raft、ZooKeeper用ZAB,都是CP的;也有人用Redis自建、天然AP),只提供 CRUD/Watch这类极简API,服务注册、健康检查等能力都要自己在上面搭建, 如今一般只有大厂才会这样直接造轮子。基于DNS基础设施(SkyDNS、CoreDNS): 好处是对应用完全透明,任何语言框架天然支持HTTP/DNS,不受技术选型约束; 坏处是这种透明并不简单——客户端负载均衡、远程调用这些问题要自己另外 解决,而且必须受限于DNS协议本身的机制(比如缓存期限只能靠TTL控制,想 换成KeepAlive长连接判活就很麻烦),CP还是AP取决于后端存储实现。专门的 服务发现框架(Eureka、Consul、Nacos):可以自己决定CP还是AP(甚至像 Nacos一样类Raft协议实现CP、自研Distro协议实现AP两者都支持,但每次只能 二选一,不是同时满足CAP),代价是对应用不透明、需要考虑语言框架集成, 但换来的是开发便捷性——因为配套组件(如Ribbon、OpenFeign)早已做好 集成,写声明式接口就能跑起来。透明度和开发便捷性在这里呈现出此消彼长 的关系。

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第7章"从类库到服务" 7.1.3节"注册中心实现"(源文件:_epub-src对应OEBPS/Text/chapter87.xhtml) - 结论依据:原文分别说明K/V框架方案需自行补全服务发现能力、DNS基础设施 方案对应用透明但受限于DNS协议机制、专用框架方案可自选CP/AP但需要语言 框架集成,直接支撑本卡片结论。 - 原始内容:这些K/V框架的一个共同特点是在整体较高复杂度的架构和算法的 外部,维持着极为简单的应用接口……以基础设施来做服务发现,好处是对 应用透明……坏处是透明的并不一定是简单的……将它们划归一类是因为它们 对应用并不是透明的。