一个架构的演进,从简单到复杂,需要关注的要点有一下几个因素:
功能预见性(功能性):这是架构设计的第一要务,任何架构设计不能脱离需求凭空存在,所以架构从满足需求最大程度功能上的要求。其余要点都是以满足功能为前提的,为了设计漂亮复杂的架构,而忽略功能性的要求是不可取的。而且还要考虑系统架构是能支撑多久。
系统可用性:这一点对一个被高频使用的产品只管重要,可以想象一下,像百度搜索、淘宝、微信这样的产品,或者是双十一这种大促活动,一天就有过千亿的交易和,哪怕是一分钟的不可用都会给企业带来数以千万的损失,而且还会对公司声誉造成影响,让用户失去对你的产品失去信心。所以,对于一个大型系统,对核心系统的出错几乎是 0 容忍的,对技术架构也是一个基本要求。在分布式系统的架构的设计中,要仔细考虑每个组件或者子系统的可靠性,必要时可以丢车保帅,确保核心系统不出故障。从可用性触发还可以延伸出可靠性和容错性:
容错性:另外,系统还要具备一定额容错能力,随着业务规模的扩大,系统架构也会越来越复杂,整个系统由很多组成部分构成,那么整个系统不能因为单点的故障就引起整个系统的崩溃,所以系统设计中要有容错机制。
可靠性:在容错性基础之上还要保证用户的输入出去的正确性,不能因为部分系统的错误就造成数据、操作的混乱。
性能够快:产品的性能对用户的体验有着至关重要的影响,如果产品和SEO相关,还会影响搜索引擎的排名,进而影响流量和收入。曾经有报道称,Google的页面访问速度每增加500毫秒,搜索量就会下降25%,访问亚马逊每增加100毫秒,就会损失%1的订单;Facebook 每增加500毫秒,会损失 %3 的访问量。可见性能对于产品的影响之大,创建一个高性能的系统架构对于产品而言非常重要。
可伸缩:对于大型分布式的架构,必须具有一定的伸缩性,能够面对负载的变化进行调整。比如很多电商网站网站定期举办的大促活动,比如每年的京东618,天猫双十一等,往往在这种活动期间,系统的负载要比平时翻几番。所以对应的系统架构,要具备一定的伸缩性,能够以非常容易的方式进行扩展,比如可以很容易水平增加计算资源和存储资源等就可以应对更高的流量负载。
可维护性:越复杂的系统就依赖于高度的自动化。一个大型的架构系统的维护工作一定是趋于简单,具备高可维护性。越复杂的系统越脆弱,越需要自动化的运维工具,而不是完全依赖于人力,是要尽量少的依赖人力,靠批量操作。除非必要,没有必要增加额外的依赖。
安全性:网络世界也是一个江湖,有好人也有坏人。所以架构设计中一定要考虑安全的因素,俗话说“害人之心不可有,防人之心不可无”,作为架构是要假设这个世界是不安全的,要面对种种不不完全的攻击,包括病毒、服务器的攻击,以及数据安全。
成本:在大企业工作时,往往会忽略成本的因素,因为有充足的资源让架构师可以尽情发挥。但这确实是架构设计中要考虑去的重要因素,包括软件、硬件成为,以及需要投入的人力成本,包括开发、运维、测试等等。还有就是使用新技术带来的风险和学习成本。
可度量性:架构设计的质量可以通过可量化的指标进行衡量。比如响应速度,敏捷性,批量上线的周期等等。而且每一个单独的模块可以进行测试。
当然“罗马不是一天建成的”,一个系统从简单到复杂是经过不断迭代演进而成的,不会一蹴而就,而且这些要素之间有时也是互相冲突的,作为架构师就要做的就是在以上几点之间做权衡,要考虑哪些因素对你是更重要的。