美文网首页007-2271-不出局
架构设计之复杂度的6个来源

架构设计之复杂度的6个来源

作者: 短暂瞬间 | 来源:发表于2018-12-21 22:55 被阅读0次

    第67篇

    极客时间《从0开始学架构》课程笔记。

    架构设计的目的

    架构设计的主要目的是为了解决软件系统复杂度带来的问题。

    1. 架构不可能解决所有问题,必须要分析出所面对的一个或几个关键问题
    2. 架构是决策,是取舍,是根据所拥有的资源做出当前最合适的解决方案
    3. 需求驱动架构,架构要随着业务和技术变化而变化,需要持续调整

    1、高性能

    高性能带来的复杂度主要体现在两方面:

    • 单台计算机内部为了高性能带来的复杂度
    • 多台计算机集群为了高性能带来的复杂度

    单机复杂度

    • 计算机内部复杂度最关键的地方就是操作系统,操作系统是软件系统的运行环境,操作系统的复杂度直接决定了软件系统的复杂度
    • 进程和线程是提升操作系统性能的关键技术,操作系统调度的最小单位是线程,进程是操作系统分配资源的最小单位
    • 多进程+多线程+多CPU并行,实现真正的多任务并行
    • SMP(Symmetric Multi-Processor,对称多处理器结构)是最常见的,目前流行的多核处理器方案

    集群复杂度

    • 通过大量机器来提升性能,并不仅仅是增加机器这么简单,让多台机器配合起来达到高性能的目的,是一个复杂的任务
    • 常见的集群架构方式有两种:1、 任务分配:每台机器都可以处理完整的业务任务,不同的任务分配到不同的机器上执行;2、任务分解:把原来大一统但复杂的业务系统,拆分成小而简单但需要多个系统配合的业务系统。
    • 任务分配是在硬件层级进行平行扩展,任务分解是从软件层级进行分解细化
    • 从业务的角度来看,任务分解既不会减少功能,也不会减少代码量(事实上代码量可能还会增加,因为从代码内部调用改为通过服务器之间的接口调用)

    2、高可用

    高可用:系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。

    • 本质是通过『冗余』来实现高可用
    • 高性能增加机器目的在于“扩展”处理性能
    • 高可用增加机器目的在于“冗余”处理单元

    计算高可用

    • 这里的“计算”指的是业务的逻辑处理。
    • 高可用架构与高性能架构复杂度类似,但侧重不同。
    • 高可用重点关注:任务分配器的选择、分配器与服务器之间的连接管理以及任务分配器的分配算法选择。

    存储高可用

    • 存储与计算相比,有一个本质区别:将数据从一台机器搬到到另一台机器,需要经过线路进行传输
    • 除了物理上的传输速度限制,传输线路本身也存在可用性问题,传输线路可能中断、可能拥塞、可能异常(错包、丢包),并且传输线路的故障时间一般都特别长
    • 传输延迟或中断都会导致数据不一致问题,所以存储高可用的难点不在于如何备份数据,而在于如何减少或者规避数据不一致对业务造成的影响

    高可用状态决策

    • 计算高可用和存储高可用的基础都是“状态决策”,即系统需要能够判断当前的状态是正常还是异常,如果出现了异常就要采取行动来保证高可用
    • 本质矛盾:通过冗余来实现的高可用系统,状态决策本质上就不可能做到完全正确
    • 常见决策方式:独裁式、协商式、民主式,分别对应3个难点,独裁式意味存在单点,协商式怕状态交换出问题,而民主式决策存在『脑裂』风险。
    • 状态决策不可能做到任何场景下都没有问题

    3、可扩展性

    可扩展性指系统为了应对将来需求变化而提供的一种扩展能力,当有新的需求出现时,系统不需要或者仅需要少量修改就可以支持,无须整个系统重构或者重建。

    • 具备良好可扩展性系统的两个基本条件:正确预测变化、完美封装变化。
    • 预测变化的复杂性在于不能每个设计点都考虑可扩展性,不能完全不考虑可扩展性,且所有的预测都存在出错的可能性。
    • 应对变化的方案选择也是难点,应对变化的常见方案有两种,第一种是将“变化”封装在一个“变化层”,将不变的部分封装在一个独立的“稳定层”。第二种方案是提炼出一个“抽象层”和一个“实现层”。

    4、低成本

    • 低成本与『高性能』、『高可用』相反,需要减少服务器的数量才能达成低成本目标
    • 低成本很多时候不会是架构设计的首要目标,而是架构设计的附加约束
    • 低成本的主要复杂度体现在,往往只有“创新”才能达到低成本目标。“创新”既包括开创一个全新的技术领域,也包括引入新技术或自己创造新技术。
    • 引入新技术的主要复杂度在于需要去熟悉新技术,并且将新技术与已有技术结合起来
    • 创造新技术的主要复杂度在于需要自己去创造全新的理念和技术,并且新技术跟旧技术相比,需要有质的飞跃

    5、安全

    • 安全分两类:功能安全和架构安全
    • 功能安全就是『防小偷』,架构安全『防强盗』
    • 功能安全与具体编码相关,与架构关系不大
    • 功能安全是一个逐步完善的过程,而且往往都是在问题出现后才能有针对性的提出解决方案
    • 架构安全主要依靠防火墙,通过隔离网络,划分不同网络区域,制定访问控制策略来控制不同信任程度区域间传送的数据流
    • 互联网系统的架构安全目前并没有太好的设计手段来实现,更多地是依靠运营商或者云服务商强大的带宽和流量清洗的能力

    6、规模

    • 企业级系统的复杂因为业务复杂、功能多、逻辑分支多,加上时间越久,叠加功能越多,系统变成黑盒系统,于是复杂度很高
    • 规模带来复杂度的主要原因:量变引起质变
    • 功能越来越多,导致系统复杂度指数级上升,系统的复杂度 = 功能数量 + 功能之间的连接数量
    • 数据越来越多,系统复杂度发生质变,关系数据库存储数据时,当单表数据量太大就会引起创建索引慢、数据库备份耗时很长等情况
    • 数据量太大的解决方案是拆表,但拆分多表的过程也会引入更多复杂性

    总结

    架构设计没有最好,只有最合适。不同行业不同业务场景下,架构设计的侧重点各有不同,即复杂度也需要分优先级来考虑,不光在系统整体分优先级,在系统内部也各有偏重,同一个业务下各系统的复杂度也不一样。

    相关文章

      网友评论

        本文标题:架构设计之复杂度的6个来源

        本文链接:https://www.haomeiwen.com/subject/bdnpkqtx.html