Week4 学习总结
一、互联网系统的架构
1、互联网系统面临的问题
1)高并发、大流量
2)高可用
3)海量存储
4)用户分布广泛,网络情况复杂
5)安全环境恶劣
6)需求快速变更,发布频繁
7)渐进式发展:传统软件一开始就规划好功能需求和非功能需求,互联网产品都是用一个小网站开始,渐进的发展起来的
a. 系统如何支持产品渐进式发展,支持不断的改变、不断的试错
b. 代码如何支持需求的不断变更、如何时刻保持扩展性-
2、通过伸缩性解决面临的问题
1)硬件的 垂直伸缩+水平伸缩
a. 垂直伸缩:提升硬件的性能,RAID技术、SSD、增加内存、高处理器
b.水平伸缩:通过不断增加服务器的数量,提升系统的整体性能
-->并不非一定要选择垂直伸缩或水平伸缩,关键还是看成本,尽管目前来说,垂直伸缩不是主流的解决方案,但仍然是一个可选的解决方案
2)软件的 垂直伸缩+水平伸缩
a.垂直伸缩:将系统按照业务进行拆分,将大的系统不断的拆小
b.水平伸缩:对系统进行横向切分,主要是基于功能进行层次划分,eg 接入层、业务层(controller、service...)、存储层
3、互联网架构的演进过程
不断的利用“垂直伸缩+水平伸缩” 解决问题
1)原始阶段:单机架构,应用程序+文件服务+数据库服务 放在一台机器上
2)多服务器:
a. 面临的问题:随着用户数的增长,应用程序、文件服务、数据库服务 之间彼此竞争资源,单机性能不足以支撑业务
b. 不同的应用放在不同的服务器上(水平扩展),应用程序+文件服务+数据库服务 分别放在不同的机器上
3)使用缓存:
a. 面临的问题:随着用户数的增长,并发读写数据库成为系统瓶颈
b. 使用应用本地缓存+分布式缓存,通过缓存把绝大多数请求在读写数据库前拦截掉,降低数据库压力
4)应用服务器集群:
a. 面临的问题:缓存抗住了大部分的访问请求,随着用户数的继续增长,并发压力主要落在单机应用程序上,导致响应逐渐变慢
b. 在多台服务器上分别部署应用程序,使用反向代理软件,把请求分发到独立部署的应用程序中
c. 相关技术:反向代理、负载均衡
5)数据库读写分离:
a. 面临的问题:反向代理使应用服务器可支持的并发量大大增加,但也导致更多请求穿透到数据库,使单机的数据库成为瓶颈
b. 把数据库划分为 一个写库+多个读库,通过同步机制把写库的数据同步到读库,提升数据库的服务能力
c. 相关技术:数据库中间件(组织数据库的读写分离、分库分表);主从复制、主主复制
6)使用反向代理+CDN:
a. 正常的代理代理的是客户端,反向代理代理的是服务器,指代理服务器处理客户端的请求
b. CDN是在离用户较近的网络接入处,缓存静态资源
7)使用 分布式文件系统+分布式数据库(分库分表、水平拆分+垂直拆分)
a. 面临的问题:不同业务之间的访问量差距较大,且不同业务竞争数据库,相互影响性能;单机的写库逐渐达到性能瓶颈
b. 分库:把不同业务的数据保存到不同的数据库中,降低业务之间的资源竞争,对于访问量大的业务可部署更多的服务器来支撑;分表:将大表拆分为小表,把请求分发到多台服务器的小表上,通过水平扩展来提高数据库性能
8)使用NoSQL+搜索引擎:
a. 面临的问题:随着数据的丰富程度和业务的发展,检索、分析等需求越来越丰富,数据库不适用于复杂的查询处理
b. 针对特定的场景,引入合适的解决方案。如对于海量文件存储,可通过分布式文件系统HDFS解决,对于key value类型的数据,可通过HBase和Redis等方案解决,对于全文检索场景,可通过搜索引擎如ElasticSearch解决,对于多维分析场景,可通过Kylin或Druid等方案解决
9)业务拆分(系统的垂直拆分):
a. 面临的问题:业务维度的丰富和扩大,导致一个应用中包含了太多的业务代码,使得业务的升级迭代变得困难
b. 按照业务板块来划分应用代码,使单个应用的职责更清晰,相互之间可以做到独立升级迭代
c. 相关技术:应用之间可能会涉及到一些公共配置,需要通过分布式配置中心 如Zookeeper 解决
10)微服务+中台化(依赖方式从jar包依赖变成了服务依赖,通用能力借助中台被复用):
a. 面临的问题:不同应用之间存在共用的模块,由应用单独管理会导致相同代码存在多份,导致公共功能升级时全部应用代码都要跟着升级
b. 把这些功能的代码单独抽取出来形成一个单独的服务来管理(微服务),应用和服务之间通过HTTP、TCP或RPC请求等多种方式来访问公共服务,每个单独的服务可由单独的团队来管理
c. 相关技术:通过Dubbo、SpringCloud等框架实现服务治理、限流、熔断、降级等功能
11)大数据+智能化
二、互联网系统架构中的模式
模式是 针对特定问题&场景的、可重复使用的解决方案,它描述了一个不断重复发生的问题以及该问题解决方案的核心。互联网架构模式是指为了解决“高性能、高可用、易扩展、可伸缩、安全”等问题,而被互联网应用重复使用的解决方案。具体如下:
1、分层
将系统在横向维度上进行切分:各部分职责单一化。eg 接入层、业务层(controller、service...)、存储层
2、分割
将系统在纵向维度上进行切分,将一个大系统拆分成一个一个的小系统:系统更加内聚+易于开发&维护+便于分布式部署+便于扩展
3、分布式
1)系统中的多个模块在不同服务器上部署,即可称为分布式系统,如Tomcat和数据库分别部署在不同的服务器上,或两个相同功能的Tomcat分别部署在不同服务器上
2)分层或分割的一个主要目的就是为了对切分后的模块进行 分布式部署,通过使用更多的机器来提升系统的整体性能
4、集群
1)一个特定领域的软件部署在多台服务器上并作为一个整体提供一类服务,这个整体称为集群
2)对拆分后的系统进行分布式部署后,还要对服务器进行集群化处理,即多台部署相同应用的服务器构成一个集群,通过负载均衡设备共同对外提供服务
5、缓存
1)缓存是将数据存放在距离计算最近的位置以加快处理速度,是改善软件性能的第一手段
2)CDN、反向代理、本地缓存、远程缓存
6、异步
1)进行系统解耦的一个重要手段
2)将业务操作分成多个阶段,各阶段之间通过共享数据而不是直接调用的方法进行协作
3)提高系统可用性、加快网站响应速度、消除并发访问高峰
7、冗余
1)保证服务器宕机的情况下,系统可以继续服务
2)进行数据冗余备份,保证数据不会丢失
8、自动化
1)系统的自动化运维&监控
9、安全
三、架构设计中,架构师的具体工作
1、系统的拆解
1)拆解依据:
a. 根据业务、组织结构 进行拆解
b. 根据系统的瓶颈进行拆解
->应用服务器消耗CPU
->缓存服务器消耗内存
->数据库服务器消耗磁盘
2)拆解手段:
a. 水平拆分:按功能层次拆分
b. 垂直拆分:按业务、问题领域拆分
3)拆解模式:
a. 互联网系统架构中的模式
b. 读多写少:用缓存
c. 写多读少:消息队列(异步)、分布式+集群+分库分表
2、系统的组装
1)组装方式:
a. 集群&负载均衡
b. 反向代理
2)相关问题
a. 分布式链路追踪
b. 分布式事务
c. 分布式锁
d. CAP原则&BASE理论
3、其他
1)架构设计就是分解问题,将复杂的问题变成难的问题,将难的问题再变成简单的问题
a. 分层+分割、降低复杂度
b. 问题拆解、复用、单一职责
2)如何分解系统,具体还是要看实际业务+组织结构
a. 架构混乱、有问题等,关键还是在于业务没有拆解好,好的架构要先做好拆解工作
b. 做好拆解工作后,再考虑技术方面的设计(分层、分布式、集群...)
3)理解互联网系统架构在演进的过程中,各个阶段面对的问题是什么?是通过什么手段解决问题的?
a. 学习演进的过程,重要的不是涉及到的相关技术,而是背后分析问题&解决问题的思想
b. 发现问题的能力才是直达本质的能力
评论