架构师训练营第 1 期第四周课后练习题
一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?
典型的互联网应用系统,随着用户数量从零增加到百万,甚至上亿的用户,其中面对不同量级的用户访问,系统从一个简单的单机系统,演化到提供各种服务的集群的过程中会引入许多技术手段来解决问题。
单机系统的初期,web 应用和数据库甚至可以部署在一台服务器上,随着用户增加,负载不足之后,可以选择垂直伸缩,增加 CPU,内存,更换性能更好的硬盘,但是这种伸缩随着硬件参数的倍增,成本也会越来越高,边际效应会越来越显著,成本成倍的增加,无法再换来处理能力的成倍增加,应为任何应用对资源的使用都不可能是均衡匹配硬件资源的,总会再某个资源上产生瓶颈,而数据库和应用部署在同一台服务器上,会让某些资源达到瓶颈时,其他资源使用并不充分。例如数据库大量的 IO 操作,应用处理时内存的消耗,需要大量计算时 CUP 的使用,这些都不可能按照硬件的配置去消耗。
通常在垂直伸缩不太有效,或者费用高昂时,选择数据库服务和 Web 服务分开部署,这样,数据库服务器可以根据需要选择适合顺序读取的硬盘,而 Web 应用选择适合随机读取的硬盘,CUP 核心数量和内存大小的选择也可以更加灵活。
随着访问量的持续增加,Web 应用服务器上的资源访问不平衡不平衡的问题开始明显,静态资源完全可以通过 CDN 分发的技术减轻服务器的访问压力,让服务器资源主要处理动态资源,动态资源中,对实时性要求不高的资源完全可以通过缓存继续减轻服务器的压力。再引入横向扩展能力,弹性伸缩 Web 应用,和缓存集群,Web 服务应对负载的能力可以极速扩展,利用弹性伸缩的技术,Web 服务器可以在负载均衡应用服务之后,随意的增减服务器数量,在流量高峰时增加处理能力,流量低谷时节省费用支出。使用弹性伸缩想对单机应用,需要 Web 应用在架构上进行一定的改进,保证 Web 应用的无状态,将有状态的数据文件之类的内容存储在专门的文件存储系统上甚至分布式文件系统上。
Web 应用处理负载的能力大幅提升之后,瓶颈自然来到了数据库服务这边,互联网应用通常对读取数据的时间比写入数据的时间更加在意,数据库主从复制,应用架构上的读写分离技术就开始发挥重要作用,
读取数据可以从多个从数据库中获得,分摊了一台数据库的压力,避免了尤其是插入数据时数据库对资源的消耗。
当数据库的压力持续增加时,需要对数据库上存储的数据根据内容特点细分到不同类型的数据库之中
例如搜索内容使用搜索引擎,文档数据库,而不是通过 sql 去查询关系数据库。对一些结构灵活的数据或者需要更快相应的数据,存储在 NOSQL 数据库中。
这个时候负载持续增加,以上的架构处理起负载也开始吃力的时候,就到了对业务进行拆分的时候了,这个程度的的请求如果还是单体服务,单一数据库的话,业务的重构与扩展通常也会变得非常困难,
微服务,分表,分库,重新解耦模块之间的依赖,通过消息队列异步的相互发送消息,才能让系统便于维护,方便扩展,提高负载处理能力。当然微服务相比单体应用,模块间的调用变得复杂的多,为了让模块之间相互通信,又引入了更多的技术,系统的复杂程度指数级的上升,这也是为了处理更多负载,更好的维护系统,所要付出的代价。
评论