绝大部分时候我们有了明确的目标后,对已经被验证过的成熟技术按图索骥就能够找到可选的解决方案。只有当这种方式完全无法满足需求的时候,才会考虑进行方案的创新,而事实上方案的创新绝大部分情况下也都是基于已有的成熟技术。
在《技术的本质》一书中,对技术的组合有清晰的阐述:
新技术都是在现有技术的基础上发展起来的,现有技术又来源于先前的技术。将技术进行功能性分组,可以大大简化设计过程,这是技术“模块化”的首要原因。技术的“组合”和“递归”特征,将彻底改变我们对技术本质的认识。
虽说基于已有的技术或者架构模式进行组合,然后调整,大部分情况下就能够得到我们需要的方案,但并不意味着架构设计是一件很简单的事情。因为可选的模式有很多,组合的方案更多,往往一个问题的解决方案有很多个;如果再在组合的方案上进行一些创新,解决方案会更多。
误区
设计最优秀的方案
根据架构设计原则中“合适原则”和“简单原则“的要求,挑选合适自己业务、团队、技术能力的方案才是好方案;否则要么浪费大量资源开发了无用的系统,要么根本无法实现
只做一个方案
很多架构师在做方案设计时,可能心里会简单地对几个方案进行初步的设想,再简单地判断哪个最好,然后就基于这个判断开始进行详细的架构设计了。这样做有很多弊端:
- 心里评估过于简单,可能没有思考全面;
- 架构师经验知识和技能的局限性,可能某个评估的标准和经验是不正确的;
- 单一方案设计会出现过度辩护的情况,即架构评审时,针对方案存在的问题和疑问,架构师会竭尽全力去为自己的设计进行辩护,经验不足的设计人员可能会强词夺理。
合理的做法如下:
- 备选方案数量以3~5个为佳。太少可能因为思维狭隘,考虑不周全,过多则需要耗费大量的精力和时间,并且方案之间的差别可能不明显;
- 备选的方案的差异要比较明显。如:主备方案和集群方案差异就很明显,都用ZooKeeper 做主备决策,一个检测周期是 1 分钟,一个检测周期是 5 分钟,这就不是架构上的差异,而是细节上的差异;
- 备选方案的技术不要只局限于已经熟悉的技术。设计架构时,架构师需要将视野放宽,考虑更多可能性。
备选方案过于详细
有的架构师或者设计师在写备选方案时,错误地将备选方案等同于最终的方案,每个备选方案都写得很细。这样做的弊端显而易见:
- 耗费了大量的时间和精力;
- 将注意力集中到细节中,忽略了整体的把控,可能导致耗时较久,以此方案数量不够,或者方案差异性不明显;
- 评审时其他人会被细节绕进去,评审效果差;
正确的做法是备选阶段关注的是技术选型,而不是技术细节,技术选型的差异要比较明显,对于技术细节,最终方案确定后再细节补充即可。
评估和选择
评估
前面提到了那么多指导思想,真正应该选择哪种方法来评估和选择备选方案呢?
360度环评:列出我们需要关注的质量属性点,然后分别从这些质量属性的维度去评估每个方案,再综合挑选适合当时情况的最优方案。
常见的方案质量属性点有:性能、可用性、硬件成本、项目投入、复杂度、安全性、可扩展性等。在评估这些质量属性时,需要遵循架构设计原则 1“合适原则”和原则 2“简单原则”,避免贪大求全,基本上某个质量属性能够满足一定时期内业务发展就可以了。
如一定时期内业务发展指数级爆发这种概率性事件,需要遵循架构设计原则3"演化原则",避免过度设计,一步到位的想法。即使真的出现这种情况,那就算是重新做方案,代价也是可以接受的,因为业务如此迅猛发展,钱和人都不是问题。
通常情况下,如果某个质量属性评估和业务发展有关系(例如,性能、硬件成本等),需要评估未来业务发展的规模时,一种简单的方式是将当前的业务规模乘以 2 ~4 即可,如果现在的基数较低,可以乘以 4;如果现在基数较高,可以乘以 2。例如,现在的 TPS 是 1000,则按照 TPS 4000 来设计方案;如果现在 TPS 是 10000,则按照 TPS 20000 来设计方案。
原文中的设计场景环评表如下(右侧三列三个方案):

选择
完成方案的 360 度环评后,我们可以基于评估结果整理出 360 度环评表,一目了然地看到各个方案的优劣点。但是 360 度环评表也只能帮助我们分析各个备选方案,还是没有告诉我们具体选哪个方案,原因就在于没有哪个方案是完美的,极少出现某个方案在所有对比维度上都是最优的。例如:引入开源方案工作量小,但是可运维性和可扩展性差;自研工作量大,但是可运维和可维护性好;使用 C 语言开发性能高,但是目前团队 C 语言技术积累少;使用 Java 技术积累多,但是性能没有 C 语言开发高,成本会高一些……诸如此类。
误区:
- 数量对比法:简单地看哪个方案的优点多就选哪个,这种方案主要的问题在于把所有质量属性的重要性等同,而没有考虑质量属性的优先级。
- 加权法:每个质量属性给一个权重,这种方案主要的问题是无法客观地给出每个质量属性的权重得分。
正确的做法是按优先级选择,即架构师综合当前的业务发展情况、团队人员规模和技能、业务发展预测等因素,将质量属性按照优先级排序,首先挑选满足第一优先级的,如果方案都满足,那就再看第二优先级……以此类推。
那会不会出现两个或者多个方案,每个质量属性的优缺点都一样的情况呢?
理论上是可能的,但实际上是不可能的。前面提到,在做备选方案设计时,不同的备选方案之间的差异要比较明显,差异明显的备选方案不可能所有的优缺点都是一样的。
--------来源《极客课程》∙ 学习摘要


被折叠的 条评论
为什么被折叠?



