知识卡片
从配置数据的四个特征,反推出恰当的存储组件
内容
QConf在动手设计架构之前,先明确给出了对”配置信息”这类数据的定位——单条数据量小、更新相对频繁(相对代码而言)、配置总数可能巨大但单台机器实际关心的配置数有限、读多写少。这个定位不是可有可无的背景说明,而是直接决定了后续组件选型的依据:正因为单条数据小,才可以把每条配置内容直接存储为ZooKeeper里的一个ZNode,不需要考虑大对象存储的问题;正因为读多写少,无锁化的客户端读取设计才有意义(并发写入的正确性问题在这种负载模式下发生概率很低);正因为更新相对频繁但又不是极端高频,ZooKeeper基于Watch的订阅通知机制(而不是更重的轮询机制)恰好能匹配这种更新节奏,既保证了变更能被及时感知,又不会因为过于高频的更新而把ZooKeeper压垮;而”配置总数巨大但单机关心的少”这个特征,则说明不需要让每台客户端机器缓存全量配置,只按需缓存自己实际用到的那部分即可。这个案例给出了一条架构设计的基本方法论:技术选型不应该是”先挑一个流行的/自己熟悉的组件,再看它能不能凑合用”,而应该反过来——先把要处理的数据本身的特征(大小、读写比例、更新频率、访问局部性)梳理清楚,这份特征清单本身就是候选组件的筛选条件,一旦想清楚了数据特征,很多组件选型的决策会变得自然而然,而不是靠直觉或流行度去拍板。
参考来源
- 位置:《高可用架构(第1卷)》第5章《运维保障》"5.1 360如何用QConf搞定两万台以上服务器的配置管理"节,"5.1.3 架构介绍"及"5.1.4 QConf服务端"(源文件:_epub-src/OEBPS/Text/Chapter5_1_4.xhtml、Chapter5_1_5.xhtml)
- 结论依据:原文列出配置信息的四个定位特征("单条数据量小……更新频繁……配置总数可能巨大,但单台机器关心配置数有限……读多写少"),并说明"根据上面提到的对配置内容的定位,我们认为可以将单条配置内容直接存储在ZooKeeper的一个ZNode上,并利用ZooKeeper的Watch监听功能实现配置变化时对客户端的及时通知",直接支撑本卡片结论。
- 原始内容:单条数据量小。更新频繁(较代码而言)。配置总数可能巨大,但单台机器关心配置数有限。读多写少……我们认为可以将单条配置内容直接存储在ZooKeeper的一个ZNode上,并利用ZooKeeper的Watch监听功能实现配置变化时对客户端的及时通知。