浅析系统结构

2,295 阅读5分钟

为什么要做架构设计

  1. 大家都做,所以我也做。
  2. 所有的系统必须要有架构设计
  3. 公司要求,系统开发必须要有架构设计的流程

如果是以上的原因,就失去了做架构的意义,是为了做架构而做架构,可能会浪费人力物力得不偿失。 那么做架构的目的是什么呢?

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

系统复杂度的来源

  1. 高性能

    为了提高性能又从两个方面可以提升

    • 单机复杂度

    计算机内部复杂度的关键就是操作系统,操作系统和性能最相关的是进程和线程。人们发明出进程,一个进程对应一个任务,会占用独立的内存。多个进程之间为了相互通信所以设计各种通信方式:管道、消息队列、共享储存等等。

    人们为了解决单线程会阻塞用户使用的问题所以发明了多线程,多进程多线程可以使性能更大的提升。

    • 集群复杂度

    在互联网时代,有时用户访问量会急剧升高。例如2017年春节微信红包收发红包每秒达到 76 万个。为了解决这种问题,单机的性能提升是解决不了问题的,只能通过加大机器的数量来得到提升。

    通过集群的方式提高性能,最常见的两种方式是任务分配和任务分解。

    任务分配:任务分配是指每台服务器都可以都处理完整的业务任务,由任务分配器分配任务。

    任务分解:任务分解是指把复杂的系统拆解成不同的小功能。即不同的业务服务器。

  2. 高可用

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

硬件会出故障,软件会出bug都会造成中断现象。那么如何提高无中断就是提高高可用的方式。只能通过冗余来提高高可用。一台服务器不行就两台,两台不行就四台。

由此看来,高性能和高可用都是通过多台服务器来提高目的,那么他们之间有什么区别呢?高性能通过增加机器的目的是扩展提高性能,高可用是通过增加机器的目的冗余处理单元。

其中高可用的复杂度的来源有两种:计算高可用和存储高可用

  • 计算高可用: 这里的“计算”指的是业务的逻辑处理。计算有一个特点就是无论在哪台机器上进行计算,同样的算法和输入数据,产出的结果都是一样的.这里的复杂度是在于任务分配器是如何分配服务,是一主多备还是多主多备。

  • 存储高可用:用户在一台机器上计算的业务,如果同步到另一台机器上,这会存在传输的问题,所以可能会出现时间差的问题给用户造成不良的体验。所以存储高可用的复杂度不在于如何备份数据,而在于如何减少或者规避数据不一致对业务造成的影响。

  1. 可扩展

软件的开发在需求上线后也依然会有需求的变更,所以如果在需求变更的时候以很少的开发量或者不变的情况下去实现功能是最好的结果。那么可扩展的复杂度在哪里呢?

  • 不能每个设计点都考虑可扩展性。
  • 不能完全不考虑可扩展性。
  • 所有的预测都存在出错的可能性。

那么如何提高系统的可扩展性呢?

  • 短期预测:2年法则,只预测2年内的变化,5-10年的不考虑。
  • 应对变化:提炼成变化层和稳定层,把不变的部分独立封装成稳定层,把可能变化的部分封装在变化层。这种方案的核心思想就是隔离变化
  1. 低成本、安全、规模
  • 低成本:低成本往往和高性能高可用是冲突的,首先设定一个成本目标,当设计出架构方案后是否满足成本,如果不满足就要调整架构方案。低成本的复杂度在于想要低成本往往需要创新技术。
  • 安全:功能安全和架构安全。功能安全更多是和编码相关和架构关系不大。传统的架构安全主要依靠防火墙。防火墙的功能虽然强大,但性能一般,而且成本较高。

基于上述原因,互联网系统的架构安全目前并没有太好的设计手段来实现,更多地是依靠运营商或者云服务商强大的带宽和流量清洗的能力,较少自己来设计和实现。

  • 规模:很多企业级的系统,没有高性能的要求也没有高可用可扩展的要求,所以系统整体特别大。导致新接手的开发人员不敢动,改不了,看不懂等问题,所以规模的复杂度在于量变引发质变。

架构设计的原则

  1. 合适原则: 一个优秀的架构都是结合企业的人力、成本、条件、业务的条件下做出的最佳的架构方案。资源整合并发挥最大的功效并且可以快速落地。
  2. 简单原则:软件领域的复杂在于结构复杂性和逻辑复杂性。所以在设计软件架构的时候简单的方案优于复杂的方案。
  3. 演化原则:软件架构类似于大自然的产物,要一步一步演化,让生物适应环境,逐步变得强大。

以上就是我对于基础架构的初步理解。

本文章参考:《从 0 开始学架构》-- 李运华