🔣开源软件的学习方法
2022-3-6
| 2024-3-24
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password
Sub-item
Last edited time
Mar 24, 2024 01:58 AM
Parent item
领域

现有各种技术框架、开源软件的分析对比

对比的内容有:
  • 基本原理
  • 优点缺点
  • 关键设计点
  • 安装运行
  • 编写demo测试
  • 性能测试和可用性测试

源码学习步骤

  1. 安装
    1. 通过具体的安装过程,你可以获取到如下一些关键信息:
      • 这个系统的依赖组件,而依赖的组件是系统设计和实现的基础。
      • 安装目录也能够提供一些使用和运行的基本信息。
      • 系统提供了哪些工具方便我们使用。
  1. 运行
    1. 安装完成后,我们需要真正将系统运行起来,运行系统的时候有两个地方要特别关注:命令行和配置文件,它们主要提供了两个非常关键的信息:系统具备哪些能力和系统将会如何运行。这些信息是我们窥视系统内部运行机制和原理的一扇窗口。
      先把所有的配置项全部研究一遍,包括配置项的原理、作用、影响,并且尝试去修改配置项然后看看系统会有什么变化。例如,将Memcache的“--conn-limit”改为1后,查看多个连接请求时Memecache会返回什么错误、记录什么日志等。
  1. 原理研究
    1. 完成前两个步骤后,我们对系统已经有了初步的感觉和理解,此时可以更进一步去研究其原理。其实在研究命令行和配置项的时候已经涉及一部分原理了,但是还不系统,因此我们要专门针对原理进行系统性的研究。这里的关键就是“系统性”三个字,怎么才算系统性呢?主要体现在如下几个方面:
      • 关键特性的基本实现原理 每个流行的开源项目之所以能够受到大众的欢迎,肯定是有一些卖点的,常见的有高性能、高可用、可扩展等特性,那到底这些项目是如何做到其所宣称的那么牛的呢?这些牛X的技术实现就是我们要学习的地方。
        • 例如,Memcache的高性能具体是怎么做到的呢?首先是基于libevent实现了高性能的网络模型,其次是内存管理Slab Allocator机制。为了彻底理解Memcache的高性能网络模型,我们需要掌握很多知识:多路复用、Linux epoll、Reactor模型、多线程等,通过研究Memcache的高性能网络模型,我们能够学习一个具体的项目中如何将这些东西全部串起来实现了高性能。
          再以React为例,Virtual DOM的实现原理是什么、为何要实现Virtual DOM、React是如何构建Virtual DOM树、Virtual DOM与DOM什么关系等,通过研究学习Virtual DOM,即使不使用React,我们也能够学习如何写出高性能的前端的代码。
      • 优缺点对比分析 这是我想特别强调的一点,只有清楚掌握技术方案的优缺点后才算真正的掌握这门技术,也只有掌握了技术方案的优缺点后才能在架构设计的时候做出合理的选择。
        • 优缺点主要通过对比来分析,即:我们将两个类似的系统进行对比,看看它们的实现差异,以及不同的实现优缺点都是什么。
          典型的对比有Memcache和Redis,例如(仅举例说明,实际上对比的点很多),Memcache用多线程,Redis用单进程,各有什么优缺点?Memcache和Redis的集群方式,各有什么优缺点?
          即使是Redis自身,我们也可以对比RDB和AOF两种模式的优缺点。
      在你了解了什么是“系统性”后,我来介绍一下原理研究的手段,主要有三种:
      • 通读项目的设计文档:例如Kafka的设计文档,基本涵盖了消息队列设计的关键决策部分;Disruptor的设计白皮书,详细的阐述了Java单机高性能的设计技巧。
      • 阅读网上已有的分析文档:通常情况下比较热门的开源项目,都已经有非常多的分析文档了,我们可以站在前人的基础上,避免大量的重复投入。但需要注意的是,由于经验、水平、关注点等差异,不同的人分析的结论可能有差异,甚至有的是错误的,因此不能完全参照。一个比较好的方式就是多方对照,也就是说看很多篇分析文档,比较它们的内容共同点和差异点。
      • Demo验证:如果有些技术点难以查到资料,自己又不确定,则可以真正去写Demo进行验证,通过打印一些日志或者调试,能清晰的理解具体的细节。例如,写一个简单的分配内存程序,然后通过日志和命令行(jmap、jstat、jstack等)来查看Java虚拟机垃圾回收时的具体表现。
  1. 测试
    1. 通常情况下,如果你真的准备在实际项目中使用某个开源项目的话,必须进行测试。有的同学可能会说,网上的分析和测试文档很多,直接找一篇看就可以了?如果只是自己学习和研究,这样做是可以的,因为构建完整的测试用例既需要耗费较多时间,又需要较多机器资源,如果每个项目都这么做的话,投入成本有点大;但如果是要在实践项目中使用,必须自己进行测试,因为网上搜的测试结果,不一定与自己的业务场景很契合,如果简单参考别人的测试结果,很可能会得出错误的结论。例如,开源系统的版本不同,测试结果可能差异较大。同样是K-V存储,别人测试的value是128字节,而你的场景value都达到了128k字节,两者的测试结果也差异很大,不能简单照搬。
      测试阶段需要特别强调的一点就是:测试一定要在原理研究之后做,不能安装完成立马就测试!原因在于如果对系统不熟悉,很可能出现命令行、配置参数没用对,或者运行模式选择不对,导致没有根据业务的特点搭建正确的环境、没有设计合理的测试用例,从而使得最终的测试结果得出了错误结论,误导了设计决策。曾经有团队安装完成MySQL 5.1后就进行性能测试,测试结果出来让人大跌眼镜,经过定位才发现innodb_buffer_pool_size使用的是默认值8M。
  1. 源码研究
    1. 源码研究的主要目的是学习原理背后的具体编码如何实现,通过学习这些技巧来提升我们自己的技术能力。例如Redis的RDB快照、Nginx的多Reactor模型、Disruptor如何使用volatile以及CAS来做无锁设计、Netty的Zero-Copy等,这些技巧都很精巧,掌握后能够大大提升自己的编码能力。
      通常情况下,不建议通读所有源码,因为想掌握每行代码的含义和作用还是非常耗费时间的,尤其是MySQL、Nginx这种规模的项目,即使是他们的开发人员,都不一定每个人都掌握了所有代码。带着明确目的去研究源码,做到有的放矢,才能事半功倍,这也是源码研究要放在最后的原因。
通常情况下,以上5个步骤的前3个步骤,不管是已经成为架构师的技术人员,还是立志成为架构师的技术人员,在研究开源项目的时候都必不可少;第四步可以在准备采用开源项目的时候才实施,第五步可以根据你的时间来进行灵活安排。这里的“灵活安排”不是说省略不去做,而是在自己有一定时间和精力的时候做,因为只有这样才能真正理解和学到具体的技术。
 
以下流程能够满足在架构设计时进行选型判断,而且花费的时间也不多。以Elasticsearch为例,具体的做法是:
  1. 搭建一个单机伪集群,搭建完成后看看安装路径下的文件和目录,看看配置文件有哪些配置项,不同的配置项会有什么样的影响。
  1. 执行常用的操作,例如创建索引,插入、删除、查询文档,查看一下各种输出。
  1. 研究其基本原理,例如索引、分片、副本等,研究的时候要多思考,例如索引应该如何建,分片数量和副本数量对系统有什么影响等。
  1. 和其他类似系统对比,例如Solr、Sphinx,研究其优点、缺点、适用场景。
  1. 模拟一个案例看看怎么应用。例如,假设我用Elasticsearch来存储淘宝的商品信息,我应该如何设计索引和分片。
  1. 查看业界使用的案例,思考一下别人为何这么用;看看别人测试的结果,大概了解性能范围。
  1. 如果某部分特别有兴趣或者很关键,可能去看源码,例如Elasticsearch的选举算法。
  1. 如果确定要引入,会进行性能和可用性测试。
 
 
 
计算机基础
  • Docker
  • 【缓存】Redis使用及数据类型【缓存】Bloom:布隆过滤器
    目录