浓缩精华的架构演进过程( 三 )


反向代理与 CDN
随着互联网的逐渐普及,人们对网络安全和用户体验的要求也越来越高 。之前用户都是通过客户端直接访问应用服务器获取服务,应用服务器会暴露在互联网中,容易遭到攻击 。
如果在应用服务器与互联网之间加上一个反向代理服务器,它接收用户的请求,然后再转发到内网的应用服务器,充当外网与内网之间的缓冲 。
反向代理服务器只是做请求的转发,在它上面没有运行任何应用,因此当有人攻击它的时候,是不会影响到内网的应用服务器的 。
这无形中保护了应用服务器,提高了安全性 。同时,它也在互联网与内网之间起到适配和网速转换的作用 。
例如,应用服务器需要服务公网和教育网,但是两个网络的网速不同,可以在应用服务器与互联网之间放上两台反向代理服务器,一台连接公网,另一台连接教育网,屏蔽网络差异,服务于更多的用户群体 。
如图 6,公网客户端和校园网客户端分别来自公网与校园网两个不同的网络:

浓缩精华的架构演进过程

文章插图
 
图 6:加入反向代理服务器
由于两个网络访问速度不同,因此会针对两个网络分别设置共网代理服务器和校园网代理服务器,通过这种方式将位于不通网络的用户请求接入到系统中 。
聊完反向代理,再来说说 CDN,它的全称是 Content Delivery Network,也就是内容分发网络 。
如果把互联网想象成一张大网的话,每个服务器或者客户端就是分布式在网中的一个节点 。
节点之间的距离有远有近,用户请求会从一个节点跳转到另外一个节点,最终跳转到应用服务器获取信息 。
如果跳转的次数越少,就能够更快地获取信息,因此可以在离客户端近的节点存放信息 。
这样用户通过客户端,只需要较少的跳转次数就能够触达信息 。由于这部分信息更新频率不高,推荐存放一些静态数据,例如 JavaScript 文件、静态的 html、图片文件等 。
这样客户端就可以从离自己最近的网络节点获取资源,大大提高了用户体验和传输效率 。
加入 CDN 后的架构图如图 7 所示:
浓缩精华的架构演进过程

文章插图
 
图 7:加入 CDN
CDN 的加入明显加快了用户访问应用服务器的速度,同时也减轻了应用服务器的压力,原来必须直接访问应用服务器的请求,不用经过层层网络,而只用找到最近的网络节点就可以获取资源 。
但从请求资源的角度上来看,这种方式也有局限性,它只能对静态资源起作用,需要定时对 CDN 服务器进行资源更新 。反向代理和 CDN 的加入解决了安全性、可用性和高性能的问题 。
分布式数据库与分表分库
经历前面几个阶段以后,软件的系统架构相对趋于稳定 。随着系统运行时间的增加,数据库中累积的数据越来越多,同时系统还会记录一些过程数据,例如操作数据和日志数据,这些数据也会加重数据库的负担 。
即便数据库设置了索引和缓存,但在海量数据查询的时候还会捉襟见肘 。如果说读写分离,是将数据库从读写层面进行资源分配,那么分布式数据库就需要从业务和数据层面对资源进行分配 。
①对于数据表来说,当表中包含的记录过多时,会将其分成多张表来存储 。
例如:有 1000 万个会员记录,就可以将其分成两个 500 万,分别放到两个表中存储 。
也可以按照业务将表中的列进行分割,把表中的某些列放到其他表中存储,然后通过外键关联到主表,被分割出去的列通常是不经常访问的数据 。
②对于数据库来说,每个数据库能够承受的最大连接数和连接池是有上限的 。为了提高数据访问效率,会根据业务需求对数据库进行分割,让不同的业务访问不同的数据库 。当然,也可以将相同业务的不同数据放到不同的库中存储 。
如果将这些数据库资源分别放到不同的数据库服务器中,就是分布式数据库设计了 。
由于数据存储在不同的表/库中,甚至在不同的服务器上面,在进行数据库操作的时候会增加代码的复杂度 。此时可以加入数据库中间件来消除这些差异 。
浓缩精华的架构演进过程

文章插图
 
图 8:分布式数据库与分表分库
架构如图 8 所示,将数据拆分以后分别放在表 1 和表 2 中,两张表所在的数据库服务器也各不相同,库与库之间还需要考虑数据同步的问题 。


推荐阅读