美文网首页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、规模

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

总结

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

相关文章

  • 从零开始学架构

    第一章 架构基础 1.架构设计的复杂度来源 1.1 高性能 1.1.1单机复杂度 1.1.2集群复杂度 集群复杂度...

  • App通用架构设计

    App通用架构设计 App架构设计的目的 应对App功能庞大,复杂度快速上升的趋势,降低App软件开发的复杂度 提...

  • 架构复杂度的来源

    1. 高性能 高性能增加机器目的在于“扩展”处理性能,例如:平行扩展(加机器)。 2. 高可用 高可用增加机器目的...

  • 08 | 架构设计三原则

    前面几期专栏,我跟你系统的聊了架构设计的主要目的是为了解决软件系统复杂度带来的问题,并分析了复杂度的来源。从今天开...

  • 学习笔记:系统架构复杂度的来源

    架构设计的主要目的是为了解决软件系统复杂度带来的问题 1 复杂度来源:高性能性能是软件的一个重要质量属性。衡量软件...

  • 架构分层

    架构设计的目的是解决软件系统复杂度带来的问题。分层架构设计只不过是架构设计中的一种设计思想和方法论 认识分层架构 ...

  • 架构的目的

    1.架构设计的主要目的是解决系统的复杂度带来的一系列问题。 2.进行复杂度分析是架构设计的前提,以及重要依据。 3...

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

    第67篇 极客时间《从0开始学架构》课程笔记。 架构设计的目的 架构设计的主要目的是为了解决软件系统复杂度带来的问...

  • 个人收集的架构图

    消息中心架构设计 来源:

  • 【软件架构篇】复杂度来源

    架构设计的目的就是解决系统的复杂度。架构师首先需要识别出系统的复杂度,然后再针对性地给出备选方案,选择备选方案,进...

网友评论

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

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