知识卡片
三种配置管理产品路线的复杂度取舍:轮询比对、通知耦合数据库、纯粹的通知机制
内容
国内几款主流配置管理产品在实现路线上呈现出清晰的谱系差异。第一类以淘宝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),虽然实现最简单,却要用持续的无效通信开销去换取这份简单性,这个代价在大规模场景下会被放大。