架构的模式
很多软件架构都采用了一些具体的模式,也就是常用的一些解决方案。
这些解决方案被很多网站重复使用,并且也确实能够解决问题。
分层(横向拆分)
分层也被称为横向拆分。最简单容易理解的例子是,网络的七层通信协议,完美的诠释了分层的重要性。对系统分层,也使得逻辑清晰,职责分明,不同层次处理不同的事情。
分层可以更好地将一个庞大系统切分成不同的组成部分,每个部分或者说每个层次都具有一定的独立性,更加便于合作开发、维护等工作。
分层架构是逻辑上的,在物理部署上,多个层次的模块可以部署在同一台机器上。随着业务的发展,后面肯定会对已经分层的模块分离部署的,用来抗住更大的用户流量。
分层简单来看可以分为三层,应用层、服务层、数据层。
-
应用层 主要负责业务视图展示等。
-
服务层 为应用层提供服务支持。
-
数据层 为服务层提供数据,如:数据库、缓存、文件、搜索引擎。
-
图片可能表达不太准确,但是相信你,已经知道我要表达的意思了。

分割(纵向拆分)
分割就是对软件进行纵向拆分。网站越来越大,功能越来越复杂,服务和数据也越来越多。
将不同的功能拆分开,形成高内聚低耦合的单元。主要是为了软件的开发和维护,也是为了便于不同模块的分布式部署。
业务会被拆分的越来越细,高内聚低耦合的单元越来越多。
- 图片可能表达不太准确,但是相信你,已经知道我要表达的意思了。

分布式(distributed)
分布式(distributed)是指在多台不同的服务器中部署不同的服务模块,通过远程调用协同工作,对外提供服务。比如把购物分为商品、购物车、订单、支付。
集群(cluster)是指在多台不同的服务器中部署相同应用或服务模块,构成一个集群,通过负载均衡设备对外提供服务。
横向拆分和纵向拆分就是为了分布式部署。将不同模块部署到不同的服务器上,通过远程调用工作。分布式意味着很多模块,模块越多,就需要更多的计算机部署,也就是可以使用更多的计算机资源。这样能够处理的更多的访问请求,更大的数据量。
分布式也会带来一些问题,比如网络传输,服务器宕机率提升,数据一致性问题,分布式事务,依赖关系错综复杂。
-
分布式应用和服务
-
分布式静态资源
-
分布式数据和存储
-
分布式计算 目前普遍使用的Hadoop&MapReduce
-
分布式锁
-
图片可能表达不太准确,但是相信你,已经知道我要表达的意思了。

集群(cluster)
对横向拆分和纵向拆分的模块,进行了分布式部署。但是其中某些模块访问量较大,单机扛不住,所以就需要部署这个模块的集群。
对这些集群中的各个服务器进行流量分发,这些服务器负载是否一样,是否会存在大部分请求打在了某几台服务器上,这种情况下用负载均衡调节器来处理。
集群具有伸缩性,对于集群中某台机器宕机,也可用负载均衡来治理。
- 图片可能表达不太准确,但是相信你,已经知道我要表达的意思了。

缓存
缓存就是将数据存放在距离计算最近的位置以加快处理速度。缓存是改善软件性能的第一手段。
CDN: 部署在距离终端用户最近的网络服务商,用户的网络请求总是会先到达他的网络服务商哪里,在这里缓存网站的一些静态资源。
反向代理:反向代理属于网站前端架构的一部分,部署在网站的前端,当用户请求打到网站的数据中心时,最先访问到的就是反向代理服务器,这里缓存网站的静态资源,无需经过应用服务器。
本地缓存:在应用服务器本地缓存着热点数据,应用程序可以在本机内存中直接访问数据,而无需访问数据库。
分布式缓存:大型网站的数据量非常大,即使只缓存一小部分,需要的内存空间也不是单机所能承受的。
异步
软件架构有一个很重要的原则,就是解耦,降低软件的耦合性。
异步架构是典型的生产者消费者模式,两者不存在直接调用,只要保持数据结构不变,彼此功能实现可以随意变化而不相互影响。
加快网站响应速度:处理完业务请求后,将数据写入消息队列,不需要等待消费者服务器处理就可以返回,响应延迟减少。
消除并发访问高峰:使用消息队列将突然增加的访问请求放入消息队列中,等待消费者服务器依次处理,就不会对整个网站负载造成太大压力。
冗余
冗余是常用的手段,主要用来提高可用性,防止数据丢失。
数据冗余:将数据放到一台服务器上,这台服务器可能由于硬件原因或者其他原因找不到数据了,数据备份一下。
服务器冗余:提高服务可用性,假设其中一台服务器挂了,另一台服务器还可用。