程序原本(八十八):系统的基础部件——分布(分布成本与处理成本也是难于平衡的)

阅读数:21 2019 年 10 月 5 日 13:34

程序原本(八十八):系统的基础部件——分布(分布成本与处理成本也是难于平衡的)

对于任意一个大型复杂系统来说,如果它能被拆分的话,我们拆分的模式无非上述三种。而且这种从逻辑的视角进行的拆分活动,最终也会表现为数据的拆分,例如子系统与子系统各自的数据库。更进一步地,当我们不再需要考虑这些子系统之间的数据关系时,整个系统将是可持续分布、并行计算的。

虽然从我们目前的分析来看,这一切是成立的,但是现实中的系统往往并不这样简单。其中的问题之一,在于“数据并不总是可以拆分”。例如一个简单的统计日志功能,其原始的需求如下:分析某个日志文件,统计日志的总行数。

缘于这个日志文件过大,我们对日志文件进行了数据拆分:每 100M 数据分成一个文件。这样,我们在整个逻辑上就可以理解为:对于文件 log1.txt 使用逻辑 A1,对于文件 log2.txt 使用逻辑 A2,如此等等;对于整个逻辑,我们将对 A1,,An 返回值求和9

9 在这个问题中,A1,,An 是否是相同的逻辑呢?这并非一个关键问题,因为我们现在仅在讨论数据的分布。

但是 log1.txt,log2.txt,…,logN.txt 这些文件之间却存在着关系。由于数据按 100M 分段,而换行并不总是发生在分段的边界之上,所以 log1.txt 末尾可能有“半行”属于 log2.txt 的第一行……类似这样的关系,使得我们在拆分 log.txt 这个数据总量时存在一些实际限制。

这些数据方面的限制,通常是通过逻辑来弥补的。我们总是试图让“数据拆分”这一活动更简单,或更规则。其简单,意味着分布它的成本很低,例如“数据按 100M 分段”的分布成本仅仅是物理存储上的限制;其规则,意味着处理它的成本很低,例如“数据总是在换行边界上分段”,那么处理它的程序将非常容易写,并且判断逻辑会少很多,执行效率也就高很多。

但如同算法时间与空间复杂度难于平衡一样,分布成本低通常处理成本就高,反之亦然。也就是说,对于既已存在的数据集来说10,简单而又规则地拆分是两难之事。

10 这也提出了数据规划的必要性问题:若我们现在有机会规划这些数据,那么必然能降低将来处理它们的成本。

评论

发布