方案设计复杂度来源

413 阅读3分钟

这是我参与12月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

方案设计的主要目的是为了解决软件系统复杂度带来的问题。本篇文章就试图介绍方案设计过程中,方案设计复杂度的来源。

复杂度

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

  1. 计算机内部追求高性能带来的复杂度
  2. 计算机集群为了追求高性能带来的复杂度

计算机内部,cpu速度最快,很多单机的高性能方案的目的都是为了能把cpu的性能尽量多地发挥出来。常见的方案有:多进程、多线程、进程间通信、多线程并发等。需要结合业务场景进行选型,组合。

多台计算机的目的本身就是为了支撑更多的业务。它所带来的复杂度主要体现在以下几个方面:

  1. 任务分配带来的复杂度,需要增加一个任务分配器的角色,任务分配器的稳定性、分配的算法、分配方案的选择等等本身就会带来复杂度

  2. 任务分解,当任务本身足够复杂,需要对复杂任务进行拆分。理由是单个系统过于复杂,耦合较大,性能优化难以进行,风险较高。但是由于拆分后性能会下降,所以要在拆分的数量和效率之间做好平衡

高可用

高可用的关键在于无中断,本质上是通过冗余来实现。因为中断理论上难以避免,所以要通过冗余来增加系统稳定性。

计算场景下,同样需要处理增加任务分配器带来的复杂度;另外分配算法也需要认真考虑,几主几备。

存储场景下,不可能同时满足一致性、可用性、分区容错性。为了提高分区容错性,需要增加尽量多的节点,节点多了,为了保证一致性需要复制的数据就越多,可用性就越得不到保证。

存储高可用需要额外注意数据不一致对业务造成的影响。

基于冗余实现的高可用系统,状态决策本质上不可能做到完全正确。如果采用独裁式,那么独裁者出现问题则无法正确判断;如果采用协商式那么状态中断无法正确处理;采用民主式除了复杂度高,也可能会存在脑裂的问题。

可扩展性

具备良好可扩展性的系统,需要具备两个基本条件:正确预测变化、完美封装变化。

预测变化的复杂性体现在:不能每个设计点都考虑可扩展性,预测也可能出错。而这很多时候依赖于经验。

封装变化,变化层和稳定层没有确定的标准,需要设计变化层和稳定层之间的接口,进行合理的抽象,这本身就是一件很复杂的事情。