2.2.1 架构的演进
好的架构不是设计出来的,而是演进出来的。
系统立项之初,就想着设计一个大而全的架构,期待着它能够解决各个阶段的各种问题,这是不可能的。因为在初期很难预估后期业务的变化,如果在初期就落地一个大而全的项目,那么人力成本和时间成本都会很高。同时,架构并不是千篇一律的,千万不能在不同的业务和系统中生搬硬套同一个架构。先快速落地,并关注业务的变化和系统的健壮程度,在不同阶段对当前架构所面临的问题进行复盘和处理,选择一个更适合自身的方向进行优化和改进,这才是常规的做法。
在每个阶段,找到对应该阶段网站架构所面临的问题,在不断解决这些问题的过程中,系统的架构在不断地朝着正确的方向演进。这里笔者引用了李智慧老师在《大型网站技术架构:核心原理与案例分析》这本书中的案例来介绍系统常见的演进过程。
1.初始阶段的网站架构
初始阶段的网站架构比较简单,通常一台服务器就可以搞定一个网站的部署,此时的网站架构如图2-4所示。
图2-4 初始阶段的网站架构
2.应用服务和数据服务分离
随着网站业务的发展,一台服务器逐渐不能满足需求,这时就需要将应用和数据分离来提升系统的性能,此时的网站架构如图2-5所示。
图2-5 应用服务和数据服务分离的网站架构
3.使用缓存改善网站性能
80%的业务访问会集中在20%的数据上,网站基本上都会使用缓存来优化访问性能,通过缓存层的接入,减少对数据库部分的直接压力,提升网站的响应性能,此时的网站架构如图2-6所示。
图2-6 使用缓存改善网站性能的网站架构
4.使用应用服务器集群改善网站的并发处理能力
因为单一应用服务器能够处理的请求连接有限,在网站访问高峰时期,应用服务器会成为整个网站的瓶颈。因此,使用负载均衡调度服务器势在必行。通过负载均衡调度服务器,可将大量的请求分发到应用的集群中的任何一台服务器上,进一步将系统压力分散处理,此时的网站架构如图2-7所示。
图2-7 使用应用服务器集群的网站架构
5.数据库读写分离
当用户数量达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈,而目前主流的数据库都提供主从热备功能,通过配置两台数据库的主从关系,可以将一台数据库的数据更新并同步到另一台服务器上,网站利用数据库这个功能实现数据库读写分离,从而减轻数据库负载压力,此时的网站架构如图2-8所示。
图2-8 数据库读写分离的网站架构
6.使用反向代理和CDN加速网站响应
随着系统规模越来越大,需要响应全国甚至全球各区域的访问,但是各区域的访问速度差别巨大。为了提高网站的访问速度,可以使用反向代理和CDN加速网站响应,此时的网站架构如图2-9所示。
7.使用分布式文件系统和分布式数据库系统
任何强大的单一服务器都满足不了大型网站持续增长的业务需求。分布式文件系统和分布式数据库系统可以进一步提升系统的可用性,并提升系统的响应速度,此时的网站架构如图2-10所示。
图2-9 使用反向代理和CDN的网站架构
图2-10 使用分布式文件系统和分布式数据库系统的网站架构
8.使用NoSQL和搜索引擎
某些系统可能会出现海量数据存储和检索的需求,此时可以使用NoSQL产品分布式部署来支持海量数据的查询和存储,此时的网站架构如图2-11所示。
图2-11 使用NoSQL和搜索引擎的网站架构
9.业务拆分和分布式服务
大型网站为了应对日益复杂的业务场景,通过使用分而治之的手段将整个网站业务拆分成不同的产品线,通过分布式服务来协同工作,此时的网站架构如图2-12所示。
图2-12 业务拆分和分布式服务的网站架构
常见的网站架构演进过程如图2-13所示。
图2-13 《大型网站技术架构:核心原理与案例分析》书中常见的网站架构的演进过程
李智慧老师的《大型网站技术架构:核心原理与案例分析》一书于2013年9月出版,整理书稿的时间肯定更早一些,因此书中并没有近几年较流行的微服务架构、领域驱动及服务网格Service Mesh相关的描述,这些也是分布式服务的一些网站架构演进方向。