最近读完了Martin Kleppmann的《数据密集型应用系统设计》(Designing Data-Intensive Applications,简称DDIA),这本书被很多人称为分布式系统领域的圣经,读完之后我深有同感,确实是一本非常好的书,值得每一个做后端和分布式系统的工程师认真读一读。
这本书从数据模型、存储引擎、复制、分区、事务、一致性、分布式系统的麻烦、批处理、流处理等各个方面,系统地讲解了数据密集型应用系统的设计原理和实践,内容非常扎实,也很有深度。
今天这篇文章,就来聊聊这本书,聊聊它的核心内容,以及它为什么是分布式系统领域的必读书,希望能给想读这本书或者想学习分布式系统的朋友一些参考。
一、先说说作者和这本书
先说说作者Martin Kleppmann。他是一位分布式系统领域的专家,曾经在LinkedIn和Rapportive工作,现在是剑桥大学的研究员,主要研究分布式系统和数据系统。他不仅有丰富的工业界实践经验,还有很深的学术造诣,在分布式系统领域有很多研究成果,也经常在各种技术会议上做分享。
《数据密集型应用系统设计》这本书出版于2017年,是Martin Kleppmann多年实践和研究的总结。这本书出版之后,立刻在技术圈引起了轰动,被很多人称为分布式系统领域的圣经,几乎是每个后端工程师和分布式系统工程师的必读书。
这本书的特点是,它不是一本教你怎么用某个具体技术的书,而是一本讲原理和思想的书。它不会教你怎么用MySQL,怎么用Redis,怎么用Kafka,但是它会告诉你这些技术背后的原理是什么,它们是怎么设计的,为什么这么设计,各自有什么优缺点,适用于什么场景。
读这本书,你学到的不是某个具体技术的用法,而是数据系统的设计思想和原理,这些东西是不会过时的,不管技术怎么更新换代,这些底层的原理和思想都是通用的。这也是这本书能成为经典的原因。
二、这本书的核心内容
这本书的内容非常丰富,分为三个部分,共12章,下面我简单介绍一下每个部分的核心内容。
第一部分:数据系统的基础
第一部分主要讲数据系统的基础知识,包括数据模型、存储引擎、编码和演化。
第一章讲数据模型和查询语言,介绍了关系模型、文档模型、图模型等不同的数据模型,以及它们各自的优缺点和适用场景。这一章让我对数据模型有了更深入的理解,原来不同的数据模型不是谁取代谁的关系,而是各自适用于不同的场景,选择合适的数据模型很重要。
第二章讲存储和检索,介绍了数据库的存储引擎是怎么工作的,包括哈希索引、LSM树、B树等不同的存储结构,以及它们各自的优缺点。这一章非常精彩,让我理解了数据库底层是怎么存储和检索数据的,为什么有的数据库写快读慢,有的读快写慢,这些都是由底层的存储结构决定的。
第三章讲编码和演化,介绍了数据的编码格式,比如JSON、XML、Protocol Buffers、Thrift、Avro等,以及数据模式演化的问题。这一章让我理解了为什么在分布式系统中,数据的编码和模式演化很重要,怎么设计才能支持前后兼容,避免系统升级的时候出问题。
第二部分:分布式数据
第二部分是这本书的核心,主要讲分布式数据系统,包括复制、分区、事务、一致性、分布式系统的麻烦等。
第五章讲复制,介绍了主从复制、多主复制、无主复制等不同的复制模式,以及它们各自的优缺点和适用场景。还讲了复制延迟带来的问题,比如读己之写、单调读、一致前缀读等,以及怎么解决这些问题。这一章让我对复制有了系统的理解,原来复制不是简单地把数据拷贝一份,里面有很多复杂的问题和权衡。
第六章讲分区,介绍了数据怎么分区,包括键范围分区、哈希分区等,以及分区的再平衡、请求路由等问题。这一章让我理解了分布式存储系统是怎么水平扩展的,数据是怎么分布到多个节点上的,怎么保证负载均衡,怎么处理节点的加入和退出。
第七章讲事务,介绍了事务的概念,ACID的含义,以及不同的隔离级别,比如读已提交、可重复读、快照隔离、可串行化等。还讲了分布式事务,包括两阶段提交、三阶段提交、XA事务等,以及它们的优缺点。这一章是这本书最难的一章之一,但是也非常重要,让我对事务和隔离级别有了深入的理解,原来"可串行化"不是那么简单的,有很多种实现方式,各自有不同的性能和正确性权衡。
第八章讲分布式系统的麻烦,介绍了分布式系统中会遇到的各种问题,比如网络延迟、网络分区、时钟问题、节点故障等,以及这些问题带来的挑战。这一章非常现实,让我认识到分布式系统比想象中复杂得多,很多在单机系统中理所当然的事情,在分布式系统中都变成了难题,比如"现在几点了"、"这个节点是不是挂了"这些简单的问题,在分布式系统中都没有确定的答案。
第九章讲一致性和共识,介绍了线性一致性、因果一致性等不同的一致性模型,以及共识算法,比如Paxos、Raft、Zab等。这一章也是这本书最难的一章之一,但是讲得很清楚,让我对一致性和共识算法有了系统的理解,原来分布式系统的一致性不是非黑即白的,有很多不同的一致性级别,各自有不同的性能和正确性权衡,共识算法是分布式系统的基础,用来解决多个节点达成一致的问题。
第三部分:衍生数据
第三部分主要讲批处理和流处理,以及数据系统的未来。
第十章讲批处理,介绍了批处理系统的原理,比如MapReduce、Hadoop、Spark等,以及它们的优缺点。这一章让我理解了批处理系统是怎么工作的,为什么批处理系统能处理这么大的数据量,它的设计思想是什么。
第十一章讲流处理,介绍了流处理系统的原理,比如消息队列、流处理框架、事件溯源、CQRS等,以及流处理和批处理的区别。这一章让我对流处理有了系统的理解,原来流处理不是简单地实时处理数据,里面有很多复杂的问题,比如时间窗口、乱序处理、状态管理、精确一次语义等。
第十二章讲数据系统的未来,是这本书的总结,探讨了数据系统的未来发展方向,比如统一批处理和流处理、数据集成、隐私和权利等。这一章很有启发性,让我对数据系统的未来有了更多的思考。
三、这本书为什么是必读书
读完这本书,我深深地觉得,这确实是分布式系统领域的必读书,主要有以下几个原因。
1. 内容系统全面,覆盖了分布式系统的核心知识
这本书的内容非常系统全面,从数据模型、存储引擎,到复制、分区、事务、一致性,再到批处理、流处理,几乎覆盖了数据密集型应用系统的所有核心知识。读完这本书,你会对分布式数据系统有一个完整的、系统的认识,不会再是一知半解的状态。
很多人学习分布式系统,都是东学一点西学一点,知识很零散,没有形成体系。这本书就能帮你把这些零散的知识串联起来,形成一个完整的知识体系,让你对分布式系统有一个全局的认识。
2. 讲原理不讲工具,知识不会过时
这本书最大的特点,就是讲原理不讲工具。它不会教你怎么用某个具体的数据库或者中间件,而是讲这些工具背后的原理和思想。
技术是不断更新换代的,今天流行的数据库,明天可能就被新的数据库取代了,但是底层的原理和思想是不会过时的。比如不管是MySQL还是PostgreSQL,底层的存储引擎都是B树或者LSM树;不管是Kafka还是RabbitMQ,底层都是消息队列和复制的原理。
读这本书,你学到的是不会过时的原理和思想,这些东西能让你受益终身,不管技术怎么变,你都能快速理解新技术的本质,因为底层的原理都是相通的。
3. 讲权衡不讲银弹,培养工程思维
这本书还有一个很大的优点,就是它不会告诉你什么技术是最好的,什么方案是银弹,而是会告诉你每个技术、每个方案都有自己的优缺点和适用场景,都是权衡的结果。
比如在讲复制的时候,它会告诉你同步复制和异步复制各自的优缺点,同步复制一致性好但是性能差,异步复制性能好但是可能丢数据;在讲事务的时候,它会告诉你不同的隔离级别各自的优缺点,隔离级别高一致性好但是性能差,隔离级别低性能好但是可能有异常;在讲一致性的时候,它会告诉你强一致性和最终一致性各自的优缺点,强一致性正确但是性能差,最终一致性性能好但是可能有短暂的不一致。
这种讲权衡不讲银弹的方式,能很好地培养你的工程思维,让你明白在工程实践中,没有最好的方案,只有最合适的方案,要根据具体的场景和需求,做出合理的权衡。这是一个优秀工程师必备的思维方式。
4. 引用丰富,知识来源可靠
这本书的引用非常丰富,几乎每一个观点都有对应的论文或者技术文章作为支撑,书后面的参考文献有几十页。这说明这本书的内容不是作者凭空想象的,而是基于大量的学术研究和工业实践总结出来的,知识来源非常可靠。
而且,这些参考文献本身就是一个宝库,如果你对某个话题感兴趣,可以顺着参考文献去读对应的论文和文章,深入学习。这本书就像一个地图,能带你进入分布式系统的知识殿堂。
5. 语言通俗易懂,可读性强
虽然这本书的内容很深,但是作者的语言非常通俗易懂,不会用很多晦涩的术语,即使有术语,也会解释清楚。而且作者很擅长用比喻和例子来解释复杂的概念,让抽象的概念变得具体易懂。
比如在讲分布式系统的时钟问题的时候,作者用了一个很生动的例子,说明在分布式系统中,每个节点的时钟都是不一样的,不能简单地用时间戳来判断事件的先后顺序;在讲共识算法的时候,作者用了一个会议室的例子,说明多个节点怎么达成一致。
这种通俗易懂的写作风格,让这本书的可读性很强,即使是初学者,也能读懂大部分内容,不会觉得太晦涩难懂。
四、适合什么人读
这本书虽然很好,但也不是所有人都适合读,下面说说这本书适合什么人读。
1. 后端工程师和分布式系统工程师
这本书最适合的读者,就是后端工程师和分布式系统工程师。如果你平时的工作就是做后端开发,设计和维护数据系统,那么这本书对你来说非常有价值,能帮你深入理解你每天都在用的数据库、中间件背后的原理,让你在做技术选型和系统设计的时候,做出更合理的决策。
很多后端工程师,用了很多年的MySQL、Redis、Kafka,但是只知道怎么用,不知道背后的原理,遇到问题的时候只能靠猜,或者上网搜解决方案。读了这本书之后,你就能理解这些技术背后的原理,遇到问题的时候能从原理出发,快速定位和解决问题,而不是靠猜。
2. 想学习分布式系统的人
如果你想学习分布式系统,但是不知道从哪里开始,那么这本书是一个很好的起点。这本书系统地讲解了分布式系统的核心知识,能帮你建立一个完整的知识体系,为你后续的深入学习打下坚实的基础。
很多人学习分布式系统,一上来就去读Paxos、Raft的论文,结果读得云里雾里,看不懂。其实在读这些论文之前,应该先对分布式系统有一个整体的认识,了解分布式系统会遇到哪些问题,有哪些解决方案,各自的优缺点是什么。这本书就能帮你建立这样的整体认识,然后你再去读具体的论文,就会容易很多。
3. 准备面试的人
如果你准备找后端或者分布式系统相关的工作,那么这本书也很适合你。现在大厂的后端面试,越来越注重原理和系统设计,经常会问一些分布式系统的问题,比如数据库的索引原理、主从复制的原理、事务的隔离级别、分布式一致性、消息队列的原理等。
这些问题,在这本书里都有详细的讲解。读完这本书,你就能很好地回答这些面试题,而且不是死记硬背,而是真正理解了原理,能从原理出发,给出有深度的回答。这在面试中是非常加分的。
4. 不太适合的人
这本书也有一些不太适合的读者,比如:
- 完全没有编程和数据库基础的纯小白,这本书还是有一定门槛的,完全没有基础的话,可能会读得很吃力。
- 只想学某个具体技术用法的人,这本书不讲具体技术的用法,如果你只是想知道MySQL怎么用,Redis怎么用,那这本书不适合你。
- 只想快速上手,不想深入理解原理的人,这本书是讲原理的,需要静下心来慢慢读,如果你只想快速上手做项目,那这本书可能不适合你。
五、怎么读这本书
这本书内容很多,也有一定的深度,怎么读才能有最大的收获呢?下面分享一些我的建议。
1. 慢慢来,不要急
这本书不是那种能快速读完的书,内容很多,也很有深度,需要慢慢读,仔细理解。不要想着一周就读完,那样囫囵吞枣,没有什么收获。
我建议每天读一章或者半章,读完之后停下来思考一下,把不懂的地方标记出来,查资料或者和别人讨论,直到理解为止。这样慢慢读,虽然花的时间长,但是收获会很大。
我自己读这本书,前前后后花了两个多月,有些章节读了两三遍才真正理解,但是读完之后,感觉自己对分布式系统的认识提升了一个档次,非常值得。
2. 结合实际工作来读
读这本书的时候,最好结合自己的实际工作来读,这样理解会更深刻。比如你工作中用到了MySQL的主从复制,那么在读复制那一章的时候,就可以想一想MySQL的主从复制是怎么实现的,属于哪种复制模式,有什么优缺点,遇到过什么问题,怎么解决的。
这样结合实际工作来读,你就会发现书里讲的原理和你工作中遇到的问题是对应的,能帮你更好地理解工作中的问题,也能帮你更好地理解书里的内容。
3. 做笔记,画思维导图
这本书的内容很多,读完之后很容易忘,建议边读边做笔记,把每一章的核心内容和自己的理解记录下来。还可以画思维导图,把整本书的知识结构梳理出来,这样复习的时候就很方便。
我自己读的时候,每读完一章,就会写一篇读书笔记,把这一章的核心内容和自己的理解记录下来,还画了整本书的思维导图。读完之后,回头看这些笔记和思维导图,能很快回忆起书里的内容,也能发现自己之前理解不对的地方。
4. 读不懂的地方先跳过,回头再读
这本书有些章节比较难,比如事务、一致性和共识这几章,第一次读的时候可能会读不懂,这很正常,不要灰心。读不懂的地方,可以先跳过,继续读后面的内容,等后面的内容读完了,有了更多的背景知识,再回头读之前不懂的地方,可能就懂了。
我自己读的时候,事务那一章第一次读就没太懂,尤其是可串行化的几种实现方式,看得云里雾里的。后来我先跳过,继续读后面的内容,等把一致性和共识那一章读完了,再回头读事务那一章,就感觉容易理解多了。
所以,读不懂不要急,先跳过,回头再读,很多时候就豁然开朗了。
5. 读完之后,再读一遍
这本书值得读两遍甚至三遍。第一遍读的时候,你可能只能理解个大概,很多细节没有注意到;第二遍读的时候,你会发现很多第一遍没注意到的细节,理解也会更深刻;第三遍读的时候,你就能把前后的内容串联起来,形成一个完整的知识体系。
我自己现在正在读第二遍,感觉和第一遍完全不一样,第一遍很多不懂的地方,第二遍都懂了,而且还发现了很多第一遍没注意到的精彩内容。所以,如果时间允许的话,建议读完之后再读一遍,收获会更大。
六、写在最后
《数据密集型应用系统设计》这本书,是我近两年来读过的最好的技术书之一,也是分布式系统领域当之无愧的经典之作。它系统地讲解了数据密集型应用系统的设计原理和实践,内容扎实,思想深刻,语言通俗易懂,值得每一个做后端和分布式系统的工程师认真读一读。
如果你是一个后端工程师或者分布式系统工程师,如果你想深入理解数据系统的原理,如果你想提升自己的系统设计能力,那么我强烈推荐你读一读这本书。相信我,读完之后,你一定会觉得受益匪浅,对分布式系统的认识会提升一个档次。
当然,这本书只是一个起点,分布式系统是一个非常庞大和复杂的领域,还有很多东西需要学习。但是这本书能帮你打下坚实的基础,建立完整的知识体系,为你后续的深入学习指明方向。
最后,用书中的一句话来结束这篇文章:"好的系统不是靠堆砌组件实现的,而是靠理解每个组件的特性和局限,然后把它们组合成一个大于部分之和的整体。"愿我们都能在分布式系统的道路上,不断学习,不断进步,设计出更好的系统。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录