架构设计三原则

合适原则: 合适优于业界领先

架构无优劣,但存合适性。“汝之蜜糖,吾之砒霜”;架构一定要匹配企业所在的业务阶段;不要面向简历去设计架构,高大上的架构不等于适用;削足适履与打肿充胖都不符合合适原则;所谓合 适,一定要匹配业务所处阶段,能够合理地将资源整合在一起并发挥出最大功效,并能够快速落地。

简单原则: 简单优于复杂

"我没有时间写一封短信,所以只好写一封长信"。其实,简单比复杂更加困难。面对系统结构、业务逻辑和复杂性,我们可以编写出复杂的系统,但在软件领域,复杂代表的是“问题”。架构设计 时如果简单的方案和复杂的方案都可以满足需求,最好选择简单的方案。但是,事实上,当软件系统变得太复杂后,就会有人换一个思路进行重构、升级,将它重新变得简单,这也是软件开发 的大趋势。 简单原则是一个朴素且伟大的原则,Google的MapReduce系统就采用了分而治之的思想,而背后就是将复杂问题转化为简单问题的典型案例。

演化原则: 演化优于一步到位

大到人类社会、自然生物,小到一个细胞,似乎都遵循这一普世原则,软件架构也不例外。业务在发展、技术在创新、外部环境在变化,这一切都是在告诫架构师不要贪大求全,或者盲目照搬 大公司的做法。应该认真分析当前业务的特点,明确业务面临的主要问题,设计合理的架构,快速落地以满足业务需要,然后在运行过程中不断完善架构,不断随着业务演化架构。怀胎需要十 月,早一月或晚一月都很危险。

架构设计流程

一. 识别复杂度

确定系统面临的主要复杂度问题, 进而明确设计方案的目标

二. 设计备选方案

  1. 几种常见的架构设计误区 (1)设计最优秀的方案。不要面向“简历”进行架构设计,而是要根据“合适”、“简单”、“演进”的架构设计原则,决策出与需求、团队、技术能力相匹配的合适方案。 (2)只做一个方案。一个方案容易陷入思考问题片面、自我坚持的认知陷阱。
  2. 备选方案设计的注意事项 (1)备选方案不要过于详细。备选阶段解决的是技术选型问题,而不是技术细节。 (2)备选方案的数量以 3~5个为最佳。 (3)备选方案的技术差异要明显。 (4)备选方案不要只局限于已经熟悉的技术。

三. 评估和选择备选方案

按优先级选择,即架构师综合当前的业务发展情况、团队人员规模和技能、业务发展预测等因素,将质量属性按照优先级排序,首先挑选满足第一优先级的,如果方案都满足,那就再看第二优 先级……以此类推。

四. 详细方案设计

例如,Nginx的负载均衡策略,简单按照下面的规则选择就可以了。
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,后端服务器分配的请求数基本一致,如果后端服务器“down掉”,能自动剔除。
加权轮询
根据权重来进行轮询,权重高的服务器分配的请求更多,主要适应于后端服务器性能不均的情况,如新老服务器混用。
ip_hash
每个请求按访问IP的hash结果分配,这样每个访客固定访问一个后端服务器,主要用于解决session的问题,如购物车类的应用。
fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配,能够最大化地平衡各后端服务器的压力,可以适用于后端服务器性能不均衡的情况,也可以防止某台后端服务器性能
不足的情况下还继续接收同样多的请求从而造成雪崩效应。
url_hash
按访问URL的hash结果来分配请求,每个URL定向到同一个后端服务器,适用于后端服务器能够将URL的响应结果缓存的情况。
这几个策略的适用场景区别还是比较明显的,根据我们的业务需要,挑选一个合适的即可。例如,比如一个电商架构,由于和session比较强相关,因此如果用Nginx来做集群负载均
衡,那么选择ip_hash策略是比较合适的。