互联网架构演化

对于一个大型网站,主要有以下几个特征:

  1. 支撑海量数据
  2. 非常高的访问量
我们常见的大型网站,如百度、淘宝、京东等,都是一个分布式系统 。这么复杂的系统也不是一天建成的,每个系统都经历了漫长的演变过程 。
架构演变
在大型网站中,其最核心的功能就是 计算 和 存储 。因此系统演变过程也主要围绕这两点进行 。
1 单机系统
在网站刚刚起步时,数据量、访问量都非常小,通常情况下,只需一台应用服务器就可以了 。
1.1 单机部署方案
起步时,我们把所有资源全部打包到部署文件中(如 XXX.war),其中包括
  1. class 文件、依赖 jar等;
  2. js、css、图片等静态资源;
  3. 对于用户上传文件的场景,直接在服务器上新建一个目录,将上传的文件放置在目录即可 。
然后,将打好的发布包放到 Web 容器中,比如 Tomcat,最后启动容器,让其直接对外提供服务 。
互联网架构演化

文章插图
 
 
该部署策略有以下几个特征:
  1. 用户通过浏览器直接与 JAVA 应用程序进行交互(通常是 Tomcat);
  2. Java 应用程序通过 JDBC 与本机的数据库进行交互(如 MySQL);
  3. 如果存在文件读写的需求,Java 应用程序通过文件接口直接对文件进行操作 。
这时,有人会问,Java 应用程序直接对外,会不会存在一些安全或性能方面的问题呢?
是的,Tomcat 这种 Web 容器对链接的保持能力比较弱,当存在大量链接时,性能下降很快 。同时,Tomcat 并不擅长静态资源的处理,对此,我们可以引入 Nginx,以缓解 Tomcat 的压力 。
 
1.2 单机部署方案进阶
我们在单机部署基础上,添加 Nginx,也就有了进阶方案 。
互联网架构演化

文章插图
 
 
该方案存在以下特征:
  1. 用户不在直接与 Java 应用程序进行交互,而是与 Nginx 进行交互;
  2. Tomcat 挂在 Nginx 后,对动态请求进行处理;
  3. 对于静态资源的访问,通过 Nginx 直接访问文件系统;
  4. 当有文件写需求时,通过 Java 应用程序直接写入磁盘 。
此时,架构显得清晰很多,但我们发现一个问题,就是系统对静态资源和动态资源的处理是完全不同的 。
对于静态资源的处理,相对简单,只是简单的文件读写 。而,动态请求(也就是我们的业务承载者)会随着业务的发展越来越复杂 。
 
2 动静分离部署方案
由于 静态请求 与 动态请求 采用不同的处理策略,我们可以将其进行分离 。
互联网架构演化

文章插图
 
 
该部署方案存在以下特性:
  1. 通过不同的域名对 动态请求 和 静态请求 进行分离;
  2. 新增 静态资源服务器,专门处理静态请求,并在服务器上部署 Java 应用程序,处理文件写需求;Nginx 只负责文件的读操作;
  3. 对 动态请求 进行独立部署,应用程序将文件的写请求转发到静态服务器进行处理;
静态资源服务器功能单一,部署繁琐,有没有一种更好的策略呢?
答案就是云服务,比如阿里云的 OSS 提供静态资源存储服务 。CDN 提供访问加速服务,两者结合使用,就得到了一个海量容量并且性能超强的静态资源服务器(集群) 。
 
结合 OSS 和 CDN,静态请求不会成为系统的瓶颈,因此,接下来只对动态请求进行讨论 。
 
随着系统访问量的增加,动态请求出现了明显的瓶颈 。
3 应用集群化部署
由于所有的动态请求全部由一台应用服务器进行处理,当访问量上升时,这台服务就成了系统的瓶颈 。此时,我们需要将系统中的多个组件部署到不同的服务器上 。
互联网架构演化

文章插图
 
 
新部署有以下特征:
  1. 对 Nginx 进行独立部署,形成 Web 集群;
  2. 对 Java 应用程序进行独立部署,形成 应用集群;
  3. 对 数据库 进行独立部署;
  4. Web 集群 与 应用集群 间通过 HTTP 协议进行交互;
  5. 应用集群 与 数据库 间通过 JDBC 协议进行交互 。


    推荐阅读