过去的一年,我在分布式学习这条道路上苦苦徘徊,始终没有找到一个好的学习方法,一个能激励我持续学习的方法。
当然,我也在不停的反思,最先发现的问题是学习不系统,东看看,西看看,看过就忘。于是写了一篇文章《带着问题学习分布式系统》提出了一些问题,然后写了两篇文章来回带自己提出的问题。回过头看,其实这两篇文章都是基于分布式存储的。
然后接下来,又是一段时间的迷茫,不知道要学习啥(也是在学习Paxos的时候遇到了阻碍),偶然看到了关于SMART的一些文章,发现原来自己的学习一点都不SAMRT,所以坚持不下去。于是又写了一篇文章《带着SMART原则重新出发》,希望给自己设定SMART的目标,结果被博友打脸“一点都不smart”,而且也被结果打脸了,确实没有让我“重新出发”。
我也曾经在网上搜索,“如何学习分布式系统“,但并没有找到理想的、或者说适合我的学习方法。网上的答案,都是说,看这些论文,看这些系统的实现。。。或者很多大学的课程,都是罗列出一堆术语:概念、协议、组件。而我觉得,逐个去了解这些术语似乎很无聊,因为不知道为什么要这个协议,或者说这些协议、组件是如何组合起来的。
在没有得到适合自己的方案之后,我自己思考,希望更系统、全面的掌握,于是写了这篇文章《什么是分布式系统,如何学习分布式系统》。主要内容是,从一个实际的大型网络出发,思考会遇到哪些问题,需要哪些分布式协议与组件。写完这篇文章,我的想法就是,逐个去学习这些组件。
春节的时候,看完了《小强升职记》,里面写到要用六个高度与大树分解法来设定自己的目标,制定自己的执行计划。于是,我尝试用这两个方法来指导我对分布式的学习。遗憾的是,在大数据分解法 树干(月计划)这一层,我就无法计划下去了,不知道每个月要学啥。具体原因,我想,还是没有一个对分布式系统的整理的认识。怎么整体把握呢,我想起了之前看到过的思维导图,于是就想画一张分布式系统的思维导图,然后逐个击破。当然,最开始也是瞎画,当时划出了5个树干,是这样子的:
在延伸feature(分布式系统需要考虑的特性)的时候,我逐渐明白,这是因为要满足这些feature,才设计了很多协议与算法,也提出了一些理论。比如说,这是因为要解决去中心化副本的一致性问题,才引入了Paxos(raft)协议。而每一个分布式系统,如分布式存储、分布式计算、分布式消息队列、分布式RPC框架,根据业务的不同,会使用不同的方法来满足这些feature,对这些feature的支持也可能会有权衡,比如一致性与可用性的权衡。
所有,我觉得从分布式的特性出发,来一步步学习分布式是一种可行的方式。
从分布式系统的特征出发分布式的世界中涉及到大量的协议(raft、2pc、lease、quorum等)、大量的理论(FLP, CAP等)、大量的系统(GFS、MongoDB、MapReduce、Spark、RabbitMQ等)。这些大量的知识总是让我们无从下手,任何一个东西都需要话费大量的时间,特别是在没有项目、任务驱动的时候,没有一个明确的目标,真的很难坚持下去。
所以,我一直在思考,能有什么办法能把这些东西串起来,当我了解了知识点A的时候,能自然地接下去学习B知识,A和B的关系,也许是递进的,也许是并列的。我也这样尝试了,那就是《什么是分布式系统,如何学习分布式系统》一文中我提到的,思考一个大型网站的架构,然后把这些协议、理论串起来。按照这个想法,我的计划就是去逐个学习这些组件。
但是,其实在这里有一个误区,我认为一个大型网站就是一个分布式系统,包含诸多组件,这些组件是分布式系统的组成部分;而我现在认为,一个大型网站包含诸多组件,每一个组件都是一个分布式系统,比如分布式存储就是一个分布式系统,消息队列就是一个分布式系统。
为什么说从思考分布式的特征出发,是一个可行的、系统的、循序渐进的学习方式呢,因为:
(1)先有问题,才会去思考解决问题的办法
由于我们要提高可用性,所以我们才需要冗余;由于需要扩展性,所以我们才需要分片
(2)解决一个问题,常常会引入新的问题