网站技术架构(2)—模式

分层

分层是企业应用系统中最常见的一种架构模式,将系统在横向上分成不同的几个部分,每个部分负责一个单一的职责,然后通过上层对下层的依赖和调用组成一个完整的系统。

分层结构在计算机中随处可见,网络的7层通信协议也是一种分层结构,我们使用的计算机硬件、操作系统、应用软件也是一种分层。大型网站也采用分层结构,将网站分成应用层、服务层、数据层。

  1. 应用层:负责具体业务和视图的展示,如网站首页以及对搜索结果的展示。
  2. 服务层:为应用层提供服务支持,比如用户管理服务,搜索服务等。
  3. 数据层:数据层提供数据的访问服务,比如数据库、缓存、文件等等。

通过分层,一个复杂的网站就被分割成不同的部分,各层之间相互独立,只需要维持接口不变就可以互相调用,便于分工开发和维护,最终应用层只需要针对不同的具体业务单独单独调整即可,服务层和数据层不需要变动。

当然使用分层的时候,也要遵守一些约束,否则会导致分层的混乱。

  1. 合理的规划层次边界和接口。
  2. 严格遵守分层架构的约束。
  3. 禁止跨层次调用,如应用层直接调用数据层。
  4. 禁止逆调用,如服务层调用应用层。

在实际的工程项目中,大的分层就是这样的三层结构,但是我们还可以继续细分下去,比如应用层又可以分为视图层和业务逻辑层,数据层也可以细分为数据接口层,用来适配输入和输出的格式,以及逻辑处理层,用于查询具体的数据等。

分割

分层是对网站进行横向的切分,分割是对网站进行纵向的切分。

网站越庞大,功能就会越复杂,服务和数据的种类就越多,仅凭一个团队是不可能维护过来的。

因此这个时候就需要将不同的功能分割开,包装成高内聚低耦合的功能模块单元,每个功能模块由一个团队进行维护开发,最终在网站首页上只需要将不同的功能模块拼接起来就可以了。

这种方式不仅有助于提高开发和维护效率,又利于不同模块之间的分布式部署,提高网站的并发处理能力和功能扩展能力。

分布式

对于大型网站来说,分层和分割的一个主要目的是切分之后的模块可以单独进行分布式部署,即不同的模块部署在不同的服务器上,通过远程调用协同工作。

分布式意味着可以使用更多的服务器完成同样的工作,服务器数量越多,CPU、内存、存储资源也就越多,能够支持的并发量就越大,可以为更多的用户提供服务。

然而分布式虽然提高了网站的并发性,但是也带来了新的问题:

  1. 分布式必须调用网络,会造成性能影响。
  2. 服务器越多,宕机的几率就越大,一旦部署服务的服务器宕机的话,可能会导致多个应用无法访问。
  3. 数据在分布式的环境中很难保证一致性。
  4. 网站依赖更加复杂,维护困难。

因此,我们在进行服务器部署的时候要考虑清楚是否有必要进行分布式部署,不能为了分布式而分布式。

通常的分布式方案有以下几种:

  1. 分布式应用和服务:将切分后的应用和服务模块进行分布式部署,可以提高并发性,减少数据库连接开销,并且服务可以共用,便于业务扩展。
  2. 分布式静态资源:将JS、CSS、图片等静态资源独立分布式部署,并且采用独立域名,可以减轻应用服务器的敷在压力,并且独立域名可以加快浏览器访问资源的速度。
  3. 分布式数据和存储:大型网站的海量数据必须进行分布式部署,单台服务器不可能提供如此庞大的存储空间。出了传统的关系数据库进行分布式部署之外,NoSQL产品几乎都是分布式的。
  4. 分布式计算:网站中大部分用户没有直观感受的后台业务计算,比如搜索引擎的艘多、数据分析统计等,都需要进行分布式计算。目前网站普遍使用的分布式计算框架Hadoop、MapReduce等,都是将计算程序分发到数据所在的位置以加速计算和分布式计算。

此外,还有可以支持网站线上服务器配置实时更新的分布式配置;分布式环境下实现并发和协同的分布式锁;支持云存储的分布式文件等。

集群

我们使用分布式部署了切分后的应用和服务之后,还需要对用户集中访问的模块,比如网站首页,进行服务器集群化处理,即多台服务器部署相同的应用构成一个集群,通过负载均衡设备共同对外提供服务。

因为服务器集群有更多的服务器并且都提供相同的服务,因此可以提供更好的并发性,当有更多用户访问的时候,只需要向集群中添加新的机器即可。并且当有一台服务器宕机的时候,负载均衡设备会将请求转移到集群中其他运行良好的服务器上,不会影响用户的访问和使用。

在具体的网站应用中,即使是访问量很小的分布式应用和服务,也需要至少部署两台服务器构成一个小集群,提高系统的可用性。

缓存

缓存就是将数据存放到离计算机最近的位置以加快访问速度。

缓存是改善性能的第一手段,每一个大型网站在架构设计上都使用了缓存设计。

  1. CDN:内容分发网络,部署在距离终端用户最近的网络服务商,用户的请求总是先到达服务商这里,在这里缓存的一些网站静态资源可以以最快的速度直接返回给用户。
  2. 本地缓存:应用服务器本地缓存着大量的热点数据,用户在访问这些数据的时候直接从缓存中访问,而不需要读取数据库。
  3. 反向代理:当用户的请求到达网站的数据中心的时候,最先访问的就是反向代理服务器,这里缓存着网站的静态资源,无需继续转发请求给应用服务器就可以直接返回给用户。
  4. 分布式缓存:大型网站的热点数据量也是十分庞大的,本地缓存有时不足以存放这么多的数据,就需要将缓存独立部署到服务器上,应用通过网络请求来访问缓存数据。

使用缓存有两个前提:

  1. 数据访问热点不均衡,某些频繁被访问的数据才会被放到缓存中。
  2. 数据有有效时间,不会很快过期,否则数据就会因为已经失效而产生脏读。

在网站应用中,缓存除了可以加快数据的访问速度,还可以减轻后端应用和数据存储的负载压力。

异步

异步对于前端工程师来说是一个很常见的概念。

异步架构师典型的生产消费者模式,二者之间不会直接调用,只要保持数据结构不变,彼此的功能实现就可以随意变化,非常有利于网站的扩展。

异步的消息队列还有以下的特性:

  1. 提高系统可用性:消费者服务器宕机的时候,数据会在消息队列中堆积,生产者服务器可以继续处理业务请求,对用户来说,系统整体表现没有故障。消费者服务器恢复正常之后,就可以继续处理堆积在消息队列中的数据了。
  2. 加快网站访问速度:前端接受到用户请求之后,直接写入消息队列并且返回给用户响应,不需要等到请求处理完。
  3. 消除并发访问高峰:在特殊时间段,比如网购打折时期,网站的访问量突增,会导致整个网站的负载过重,响应延迟,甚至出现服务器宕机(参考新浪微博)。这种时候,使用异步消息队列就可以将突增的请求数据放入消息队列中,等待消费者服务器依次处理即可,不会对整个网站造成太大的负载压力。

冗余

网站需要7*24小时不间断的为用户提供服务,但是服务器随时可能出现异常宕机。想要保证服务器宕机的时候不丢失数据,就要在一定程度上让服务器冗余运行,数据冗余备份,这样当服务器宕机的时候,可以将其上的服务和数据转移到其他的机器上继续提供服务。

这就是为什么再小的分布式服务都必须至少部署两台服务器构成一个集群的原因了。

数据库除了定期备份,存档保存,实现冷备份之外,还可以通过主从分离实现热备份。

自动化

网站虽然保持7*24小时不间断运行,但是人不能7*24小时不间断工作,因此网站的自动化是最理想的状态。目前大型网站的自动化架构设计主要集中在发布和运维方面。

代码的发布算是一个网站的头等大事,很多小公司经常加班的原因就是分布的不顺利导致的。

自动化主要包含以下几个方面:

  1. 通过减少人为的干预,发布过程自动化可以有效减少故障。
  2. 自动化代码管理,比如常用的git。
  3. 自动化测试,代码完成之后,系统进行自动化测试,可以有效减少发布有bug代码的情况。
  4. 自动化安全监测,安全监测工具通过对代码进行静态安全扫描以及部署到安全测试环境进行安全攻击测试,评估安全性。
  5. 自动化部署,将代码自动部署到生产环境中,即所谓的上线。

除此之外,还有对线上环境的自动化监控自动化报警自动化失效转移自动化失效恢复自动化降级等等。

共有 0 条评论

Top