第67篇
极客时间《从0开始学架构》课程笔记。
架构设计的目的
架构设计的主要目的是为了解决软件系统复杂度带来的问题。
- 架构不可能解决所有问题,必须要分析出所面对的一个或几个关键问题
- 架构是决策,是取舍,是根据所拥有的资源做出当前最合适的解决方案
- 需求驱动架构,架构要随着业务和技术变化而变化,需要持续调整
1、高性能
高性能带来的复杂度主要体现在两方面:
- 单台计算机内部为了高性能带来的复杂度
- 多台计算机集群为了高性能带来的复杂度
单机复杂度
- 计算机内部复杂度最关键的地方就是操作系统,操作系统是软件系统的运行环境,操作系统的复杂度直接决定了软件系统的复杂度
- 进程和线程是提升操作系统性能的关键技术,操作系统调度的最小单位是线程,进程是操作系统分配资源的最小单位
- 多进程+多线程+多CPU并行,实现真正的多任务并行
- SMP(Symmetric Multi-Processor,对称多处理器结构)是最常见的,目前流行的多核处理器方案
集群复杂度
- 通过大量机器来提升性能,并不仅仅是增加机器这么简单,让多台机器配合起来达到高性能的目的,是一个复杂的任务
- 常见的集群架构方式有两种:1、 任务分配:每台机器都可以处理完整的业务任务,不同的任务分配到不同的机器上执行;2、任务分解:把原来大一统但复杂的业务系统,拆分成小而简单但需要多个系统配合的业务系统。
- 任务分配是在硬件层级进行平行扩展,任务分解是从软件层级进行分解细化
- 从业务的角度来看,任务分解既不会减少功能,也不会减少代码量(事实上代码量可能还会增加,因为从代码内部调用改为通过服务器之间的接口调用)
2、高可用
高可用:系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。
- 本质是通过『冗余』来实现高可用
- 高性能增加机器目的在于“扩展”处理性能
- 高可用增加机器目的在于“冗余”处理单元
计算高可用
- 这里的“计算”指的是业务的逻辑处理。
- 高可用架构与高性能架构复杂度类似,但侧重不同。
- 高可用重点关注:任务分配器的选择、分配器与服务器之间的连接管理以及任务分配器的分配算法选择。
存储高可用
- 存储与计算相比,有一个本质区别:将数据从一台机器搬到到另一台机器,需要经过线路进行传输
- 除了物理上的传输速度限制,传输线路本身也存在可用性问题,传输线路可能中断、可能拥塞、可能异常(错包、丢包),并且传输线路的故障时间一般都特别长
- 传输延迟或中断都会导致数据不一致问题,所以存储高可用的难点不在于如何备份数据,而在于如何减少或者规避数据不一致对业务造成的影响
高可用状态决策
- 计算高可用和存储高可用的基础都是“状态决策”,即系统需要能够判断当前的状态是正常还是异常,如果出现了异常就要采取行动来保证高可用
- 本质矛盾:通过冗余来实现的高可用系统,状态决策本质上就不可能做到完全正确
- 常见决策方式:独裁式、协商式、民主式,分别对应3个难点,独裁式意味存在单点,协商式怕状态交换出问题,而民主式决策存在『脑裂』风险。
- 状态决策不可能做到任何场景下都没有问题
3、可扩展性
可扩展性指系统为了应对将来需求变化而提供的一种扩展能力,当有新的需求出现时,系统不需要或者仅需要少量修改就可以支持,无须整个系统重构或者重建。
- 具备良好可扩展性系统的两个基本条件:正确预测变化、完美封装变化。
- 预测变化的复杂性在于不能每个设计点都考虑可扩展性,不能完全不考虑可扩展性,且所有的预测都存在出错的可能性。
- 应对变化的方案选择也是难点,应对变化的常见方案有两种,第一种是将“变化”封装在一个“变化层”,将不变的部分封装在一个独立的“稳定层”。第二种方案是提炼出一个“抽象层”和一个“实现层”。
4、低成本
- 低成本与『高性能』、『高可用』相反,需要减少服务器的数量才能达成低成本目标
- 低成本很多时候不会是架构设计的首要目标,而是架构设计的附加约束
- 低成本的主要复杂度体现在,往往只有“创新”才能达到低成本目标。“创新”既包括开创一个全新的技术领域,也包括引入新技术或自己创造新技术。
- 引入新技术的主要复杂度在于需要去熟悉新技术,并且将新技术与已有技术结合起来
- 创造新技术的主要复杂度在于需要自己去创造全新的理念和技术,并且新技术跟旧技术相比,需要有质的飞跃
5、安全
- 安全分两类:功能安全和架构安全
- 功能安全就是『防小偷』,架构安全『防强盗』
- 功能安全与具体编码相关,与架构关系不大
- 功能安全是一个逐步完善的过程,而且往往都是在问题出现后才能有针对性的提出解决方案
- 架构安全主要依靠防火墙,通过隔离网络,划分不同网络区域,制定访问控制策略来控制不同信任程度区域间传送的数据流
- 互联网系统的架构安全目前并没有太好的设计手段来实现,更多地是依靠运营商或者云服务商强大的带宽和流量清洗的能力
6、规模
- 企业级系统的复杂因为业务复杂、功能多、逻辑分支多,加上时间越久,叠加功能越多,系统变成黑盒系统,于是复杂度很高
- 规模带来复杂度的主要原因:量变引起质变
- 功能越来越多,导致系统复杂度指数级上升,系统的复杂度 = 功能数量 + 功能之间的连接数量
- 数据越来越多,系统复杂度发生质变,关系数据库存储数据时,当单表数据量太大就会引起创建索引慢、数据库备份耗时很长等情况
- 数据量太大的解决方案是拆表,但拆分多表的过程也会引入更多复杂性
总结
架构设计没有最好,只有最合适。不同行业不同业务场景下,架构设计的侧重点各有不同,即复杂度也需要分优先级来考虑,不光在系统整体分优先级,在系统内部也各有偏重,同一个业务下各系统的复杂度也不一样。