知识卡片

三种配置管理产品路线的复杂度取舍:轮询比对、通知耦合数据库、纯粹的通知机制

普通读书笔记卡

内容

国内几款主流配置管理产品在实现路线上呈现出清晰的谱系差异。第一类以淘宝Diamond、微博vintage为代表:把配置数据存储在MySQL或Redis这类传统存储里,客户端需要通过轮询去感知配置是否发生了变化——这种方式的固有缺陷是会产生大量”配置其实没变、但依然要发一次请求去确认”的无效通信,为了缓解这个问题,这类产品会采用比较MD5值的方式来避免每次轮询都传输完整的配置内容,但轮询本身带来的无效通信开销无法从根本上消除。第二类以百度disconf为代表:思路上和QConf比较接近,同样采用ZooKeeper的通知机制来推送变更(而不是轮询),但disconf把真实的配置数据存储在MySQL里、ZooKeeper只承担通知职责,这意味着一次配置读取实际上要涉及ZooKeeper和MySQL两套系统的协同,而且disconf整体和Java生态耦合很深,配置也相对复杂。第三类是QConf自己的路线:直接把配置数据本身存储在ZooKeeper的ZNode上,用ZooKeeper自带的Watch机制同时承担”存储”和”变更通知”两个职责,不再需要额外引入MySQL这类外部存储组件,整体架构因此变得非常简单,部署和使用的门槛也相应更低。这个横向对比给出了一条评估同类产品复杂度差异的实用视角:功能上看起来相似的几个产品(都叫”配置管理系统”),其内部复杂度可能差异巨大,关键要看它们依赖了多少个独立的组件、组件之间的职责划分是否清晰——用一个组件同时承担存储和通知两个职责(QConf),天然比拆成两个组件分别承担这两个职责、再靠协议把它们缝合起来(disconf)更简单,也更容易部署和维护;而完全依赖轮询这条路线(Diamond、vintage),虽然实现最简单,却要用持续的无效通信开销去换取这份简单性,这个代价在大规模场景下会被放大。

参考来源

- 位置:《高可用架构(第1卷)》第5章《运维保障》"5.1 360如何用QConf搞定两万台以上服务器的配置管理"节,"5.1.7 其他"(源文件:_epub-src/OEBPS/Text/Chapter5_1_8.xhtml) - 结论依据:原文说明"Diamond和vintage比较类似,它们将配置数据存在像MySQL或Redis这样的存储中,并需要通过客户端的轮训来感知配置变化……disconf与QConf类似,同样采用ZooKeeper的通知机制……不同的是,其将真实的配置数据存在MySQL中,并且整个与Java耦合很重,且配置复杂。QConf因为其对配置信息的定位,使得整个结构非常简单",直接支撑本卡片结论。 - 原始内容:Diamond和vintage比较类似,它们将配置数据存在像MySQL或Redis这样的存储中,并需要通过客户端的轮训来感知配置变化……disconf与QConf类似,同样采用ZooKeeper的通知机制,不同的是,其将真实的配置数据存在MySQL中……QConf因为其对配置信息的定位,使得整个结构非常简单,容易部署和使用。