知识卡片

规模复杂度的本质是量变引起质变

普通读书笔记卡

内容

一个系统即便没有高性能、高可用、可扩展性的硬性要求,仍然可能让人一上手就觉得”好复杂”,根源常常在于规模:功能点太多、逻辑分支太多,尤其是发展多年、不断叠加功能却缺乏历史文档的系统,后来者根本摸不清每个功能的应用场景和实现细节,面对的就是一个看不懂、不敢改的黑盒。这类复杂度的本质是”量变引起质变”——数量超过某个阈值后,复杂度不是线性增长,而是发生质的跃迁。功能数量的例子最直观:如果假设系统内功能两两相关,系统复杂度可以粗略估算为”功能数量+功能之间的连接数量”,3个功能的复杂度是3+3=6,8个功能的复杂度是8+28=36——功能数从3涨到8只是不到3倍,复杂度却涨了6倍,因为功能之间的两两连接数是按组合数增长的,接近指数级。数据规模的例子同理:当数据量真正达到”大数据”级别时,传统的收集、存储、分析工具会整体失效,需要全新的技术体系去应对(这正是Google File System、Bigtable、MapReduce三篇论文分别开创大数据存储与运算新领域的背景);即使远没到大数据级别,普通关系型数据库单表数据量一旦超出经验阈值(如MySQL单表推荐控制在5000万行左右),加索引、改表结构可能要停机数小时,索引本身的查询性能也会明显下降,备份耗时同步暴涨——而解决方案(分表)本身又会引入新的复杂性:按什么规则拆表(如按用户id还是按注册时间),拆完之后如何应对需要跨表聚合的查询(如按学历筛选用户),这些问题不会因为分了表就自动消失,只是把复杂度转移到了新的位置。

参考来源

- 位置:《从零开始学架构》第07讲《复杂度来源:低成本、安全、规模》"规模"(源文件:_epub-src/OEBPS/text00000.html) - 结论依据:原文说明"规模带来复杂度的主要原因就是'量变引起质变',当数量超过一定的阈值后,复杂度会发生质的变化",并给出功能数量复杂度公式示例"3 个功能的系统复杂度 = 3 + 3 = 6""8 个功能的系统复杂度 = 8 + 28 = 36",以及MySQL单表数据量过大导致加索引变慢、备份耗时长等具体问题和分表带来的拆表规则/跨表查询新复杂性,直接支撑本卡片结论。 - 原始内容:规模带来复杂度的主要原因就是"量变引起质变",当数量超过一定的阈值后,复杂度会发生质的变化……3 个功能的系统复杂度 = 3 + 3 = 6;8 个功能的系统复杂度 = 8 + 28 = 36……如果因为业务的发展,单表数据达到了 10 亿行,就会产生很多问题,例如:添加索引会很慢……