从软件架构演进“看”做好事情的三条边

用户头像
林昱榕
关注
发布于: 2020 年 07 月 01 日

从静态视角来看,软件架构是对软件整体结构和组件的抽象描述,用于指导大型软件系统各个方面的设计,它由各个重要组成部分及其关系构成,其中组成部分既包括功能需求模块,也包括非功能需求模块。评价架构的优劣可从性能可用性伸缩性拓展性安全性等五大要素展开分析。



所谓“这个世界唯一不变的是变化”,软件架构也不例外,我们还得从动态视角来看软件架构的演进,感受其中解决问题过程的美妙。



软件架构演进

1. 初始阶段

采用LAMP(Linux+Apache+Mysql+PHP)架构,应用程序、文件和数据库全部部署在同一个机器上。如下图:

来自书籍《大型网站技术架构》

2. 应用服务和数据服务分离

一台服务器无法应对越来越多的用户访问,故将应用服务和数据服务拆开独立部署,如下图:

来自书籍《大型网站技术架构》



3. 使用缓存改善网站性能

随着用户逐渐增多,网站又一次面临挑战:数据库压力太大导致访问延迟,进而影响整个网站的性能,用户体验受到影响。根据网站访问特点和现实世界的财富分配一样遵循二八定律:80%的业务访问集中在20%的数据上,通过将这20%的数据放到缓存中,可提升网站访问性能,同时降低数据库的访问压力。如图:

来自书籍《大型网站技术架构》



4. 利用应用服务器机器改善网站并发处理

使用缓存后,数据访问压力得到有效缓解,但是单一应用服务器能够处理的请求连接有限,在网站访问高峰期,应用服务器成为整个网站的瓶颈。使用集群是网站解决高并发、海量数据问题的常用手段。如图:

来自书籍《大型网站技术架构》



5. 数据库读写分离

网站在使用缓存后,使绝大部分数据读操作访问都可以不通过数据库就能完成,但是仍有一部分读操作(缓存访问不命中、缓存过期)和全部的写操作需要访问数据库,在网站的用户达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈。

目前大部分的主流数据库都提供主从热备功能,通过配置两台数据库主从关系,可以将一台数据库服务器的数据更新同步到另一台服务器上。网站利用数据库的这一功能,实现数据库读写分离,从而改善数据库负载压力。如图:

来自书籍《大型网站技术架构》



6. 使用反向代理和CDN加速网站响应

反向代理和CDN本质上也是缓存,同时缩短了请求响应路径,可加速网站响应,如图:

来自书籍《大型网站技术架构》



7. 使用分布式文件系统和分布式数据库

大型网站的数据量增长迅速,单一服务器的资源难以扛住存储压力。

来自书籍《大型网站技术架构》



8. 使用Nosql和搜索引擎

随着网站业务越来越复杂,对数据存储和检索的需求也越来越复杂,网站需要采用一些非关系数据库技术如NoSQL和非数据库查询技术如搜索引擎,如图:

来自书籍《大型网站技术架构》



9. 业务拆分

将一个网站拆分成许多不同的应用,每个应用独立部署维护。应用之间可以通过一个超链接建立关系(在首页上的导航链接每个都指向不同的应用地址),也可以通过消息队列进行数据分发,当然最多的还是通过访问同一个数据存储系统来构成一个关联的完整系统。如图:

来自书籍《大型网站技术架构》



10. 分布式服务

随着业务拆分越来越小,存储系统越来越庞大,应用系统的整体复杂度呈指数级增加,部署维护越来越困难。由于所有应用要和所有数据库系统连接,在数万台服务器规模的网站中,这些连接的数目是服务器规模的平方,导致存数据库接资源不足,拒绝服务。

既然每一个应用系统都需要执行许多相同的业务操作,比如用户管理、商品管理等,那么可以将这些共用的业务提取出来,独立部署。由这些可复用的业务连接数据库,提供共用业务服务,而应用系统只需要管理用户界面,通过分布式服务调用共用业务服务完成具体业务操作。如图:

来自书籍《大型网站技术架构》



通过软件架构演进这个视角,我们可以看到软件架构的一个核心价值是解决现实业务发展中的实际问题,保证业务的可持续发展和系统的稳定运行。从架构演进和大厂的架构实践,我们也可以学习到架构设计的套路,即架构模式,包括:分层分割分布式集群缓存异步冗余自动化安全



做好事情的三条边

这个概念我是从吴军老师那里学来的,用下图来说明:

“三条边”模型(来自吴军老师的得到专栏“谷歌方法论”)

下面那条边,可称为“基线”,上面那条边,可称为“极限”,中间那条斜线,可理解为从“基线”向“极限”攀登的绳索,或阶梯。



将这个“三条边”模型对应到架构演进的话,架构“初级阶段”对应曾经的“基线”,经过不断演进,各种架构模式(即中间那条绳索),架构基线不断上升,不断向“极限”靠近。目前比较热门的微服务架构、云原生架构,可以看做是架构目前的“基线”,它仍不断在演进。



“三条边”模型其实也可以对应我们的个人成长过程,正如我们现在在学习架构,我们就要把我们自己的基线至少提高到跟目前业界已知的“基线”这个水平,而不是沉浸在自我的小世界里“得过且过”。此外,还有很重要的一点是,我们需要找到一条高效地提升自我能力的“绳索”,我发现,向高手学习就是这样的一条绳索。学习他们如何发现、思考、解决问题,然后自我实践,加以验证和吸收

用户头像

林昱榕

关注

开心生活,努力工作。 2018.02.13 加入

还未添加个人简介

评论

发布
暂无评论
从软件架构演进“看”做好事情的三条边