银行核心系统

如何成为SM系列课程2-技术篇 架构设计流程

2019-08-20  本文已影响0人  2389c57fa07b

作者:费伟伟
上海华瑞银行数字银行开发中心

架构设计关注点

架构师在进行架构设计的时候除了业务功能架构还需要关注技术架构的高性能、高可用和可扩展,对于系统技术架构来说主要的复杂度都是来源于对高性能、高可用和可扩展性的要求,一旦系统涉及到高性能、高可用、可扩展其中一条,那么在制定技术架构的时候就要进行这方面技术架构的考虑。

高性能

1)单机复杂度

2)集群复杂度

目前大部分系统的交易量通过单机性能都没办法支撑,必须采用机器集群的方式来达到高性能。

高可用

保证系统高可用的核心思路就是实现冗余,实现计算、存储、网络 3方面的冗余来保证高可用。

备机如果在连接中断的情况下不认为主机有故障,则此时如果主机真的发生故障,那么系统就没有主机了,这样会导致集群出现无主的局面。

为了解决上面提到的这两种情况,一般我们会通过增加更多的连接,3连接是常用的方式,但这也不能保证绝对的没问题。


monkey 2019-08-18 10.38.58

c. 民主制:民主制决策指的是多个独立的个体通过投票的方式来进行状态决策,ZK采用的就是选举leader的方式。


monkey 2019-08-18 10.41.15

民主制决策和协商制决策比较类似,其基础都是独立的个体之间交换信息,每个个体作出自己的决策,然后按照多数取胜的规则来确定最终的状态,选举算法为了保证公平和理性一般都很复杂,例如ZK的Paxos就非常复杂。除了复杂的算法,民主制决策还有个缺陷就是脑裂。脑裂的根本原因就是,原来统一的集群因为连接中断,造成了两个独立分隔的子集群,每个子集群独立进行选举,于是选出了两个主机,这就产生了脑裂。


monkey 2019-08-18 16.48.59

如图所示,产生了两个子集群,一个子集群的主机是2,另一个集群的主机是5,这时系统出现了两个主机依然违背了系统的设计原则,两个主节点都会各自作出决策,整个系统状态就会混乱。为了解决脑裂的问题,民主式决策的系统一般会采用投票节点数必须超过系统总节点数一半的规则来处理,因此节点4和节点5没有超过一半,则不能进行选举,因此最后选出的节点2作为主节点,但是在极端情况下,节点1,2,3真的都挂了,那么就算节点4,5还是正常的也无法提供服务,这也是该方案唯一的缺陷,不过触发该问题的可能性较低。

可扩展

设计一个系统架构一方面要保证系统的高性能和高可用,还有一方面也是需要非常重要的,那就是可扩展性。系统保证可扩展性是非常困难的,扩展性的设计是一件很复杂的事情,而且没有通用的标准可以简单套上去,更多的是依靠架构师的经验和直觉。

架构设计考虑扩展性的目的就是为了应对需求变更,常见的应对需求变化的方案有两种:


monkey 2019-08-18 17.22.22

第一种应对变化的常见方案是将变化封装在一个变化层,将不变的部分封装在一个独立的稳定层。无论是变化层依赖稳定层,还是稳定层依赖变化层都是可以的,需要根据具体场景来设计。

如果系统需要支持XML、JSON、PB三种接入方式,那么最终的架构就是图中的形式1.


monkey 2019-08-18 17.26.52

如果系统需要同时支持Mysql、Oracle、DB2三种数据库存储方式,那么最终架构就是图中的形式2.

monkey 2019-08-18 17.27.08

可扩展性涉及的难点在于需要拆分出变化层和稳定层,对于哪些属于变化层,哪些属于稳定层,很多时候并不是像前面介绍的例子那么简单那么明确,这时候就要依靠对业务的理解和架构设计经验设计出变化层和稳定层,这时候可以考虑采用DDD的设计思想进行变化层和稳定层的设计。

在变化层和稳定层之间需要提炼出一个抽象层,抽象层的接口要保证稳定,具体实现层可以根据具体业务进行定制开发,当加入新功能时,只需要增加新的实现,无需修改其他层次。

架构设计流程

识别复杂度

架构设计第一步就是识别系统复杂度,所以在我们设计架构时,首先就要分析系统的复杂性,只有分析出系统的复杂性,后续的架构设计方案才不会偏离方向。

如果一个系统的复杂度本来是业务逻辑太复杂,功能耦合严重,架构师却设计了一个TPS达到5w的高性能架构,即使这个架构最终的性能再优秀也没有意义,因为架构没有解决正确的复杂性问题。

架构的复杂度主要来源于高性能、高可用、可扩展这3个方面,但架构师在具体判断复杂性的时候,不能生搬硬套,认为任何时候架构设计都必须同时满足这3方面要求。实际上大部分场景下,复杂度只有其中的某一个,少数情况下包含其中两个,如果真的出现同时需要解决3个复杂性,也必须排个优先级。

为了避免过度设计,正确的做法是将主要的复杂度问题列出来,然后根据业务,技术,团队等综合情况进行排序,优先解决当前面临的最主要问题的复杂度问题。对于按照复杂度优先级解决的方式,存在一个普遍的担忧,如果按照优先级来解决复杂问题,可能会出现解决了优先级排在前面的复杂度后,解决后续复杂度的方案需要将已经落地的方案推到重来。这个担忧理论上是可能的,但现实中几乎不可能出现。

识别复杂度对架构师来说是一个挑战,因为原始业务需求里并没有哪个地方会说明复杂度在哪,需要架构时在理解需求的基础上进行分析。

设计备选方案

有经验的架构师需要对目前主流的技术非常熟悉,对已经经过验证的架构模式烂熟于心,然后根据自己对业务的理解,挑选合适的架构模式进行组合,再对组合后的方案进行修改和调整。

技术经过这么多年的发展,新技术层出不穷,但是经过时间考验,已经被各种场景验证过的成熟技术其实更多,已经形成了一些架构套路。例如高可用的主备方案、集群方案、高性能负载均衡、多路复用、可扩展的分层、插件化等技术,在我们明确了目标后,按图索骥就能够找到可选的解决方案。只有当这种方式完全无法满足需求的时候,才会考虑逆行方案的创新,而事实上方案的创新绝大部分情况下也都是基于已有的成熟技术。

架构师需要设计多套备选方案,但方案数量可以说是无穷无尽的,架构师也不可能穷举所有方案,可以按照以下方式进行执行:

评估方案

评估和选择备选方案中最好的方案那就必须经过严格的方案评估。具体的操作方式为,列出我们需要关注的属性点,然后分别从这些属性的围堵去评估每个方案,再综合挑选适合当时情况的最优方案。

常见的方案属性点有:性能、可用性、硬件成本、项目投入、复杂度、安全性、可扩展性、用户体验等。在评估这些属性点时,需要遵循架构设计原则,合适原则、简单原则、演进原则,避免贪大求全,基本上某个属性能够满足一定时期内业务发展就可以了。

假如做一个购物网站,现在的TPS是1000,如果我们预期一年内能够发展到TPS2000,在评估方案性能时,只要能超过2000的都是合适方案,而不是说淘宝网站TPS是每秒10w,我们的购物网站也要按照淘宝的标准来设计。

有的架构师会说,如果我们业务发展迅速,业务一年翻了10倍,TPS从1000到1w,那岂不是到时候要重新做方案。

这种情况存在,但是发生的概率太小,如果每次都考虑这些小概率事件,那么会导致方案过度设计,投入浪费。考虑这个问题的时候遵循演进原则避免过度设计、一步到位的想法。这样设计出的架构,就算真的出现极端情况,业务飞速发展,那就算重新做方案和系统重构,代价也是可以接受的,那时候业务快速发展,钱已经不是问题,公司会不惜一切成本投入资源做重构。

可以参考这个表格进行对设计出的备选方案进行环评:

架构属性 方案1 方案2 方案3
性能
复杂度
硬件成本
可运维性
可靠性
人力投入
用户体验

详细方案设计

选择好了方案后就到了最后的详细方案设计阶段,有了前面的铺垫这个阶段就最简单了。本篇中主要讲述的是技术架构设计部分,在一个技术方案中还有很大的篇幅是业务架构,业务架构的设计比技术架构要简单,业务架构的设计更多的还是依赖架构师对业务的熟悉和对周边系统的了解。业务架构上的变化不会那么大,并且学习门槛比较低,技术架构的学习需要依赖长期的学习和不断的实践才能提升。

详细方案设计基本就是按照公司的模版将前面选出的备选方案按照方案模版对号入座做一定的详细描述就可以了。

总结

本篇文章主要介绍了架构设计中架构师需要关注高性能、高可用、可扩展这几个关注点,对于每个关注点需要注意的内容都做了介绍,也讲述了架构设计的流程,识别复杂度、设计备选方案、评估方案到最后的详细方案设计。本篇更多的还是介绍架构设计流程的方法论,更多的还是要在实际项目中不断积累经验,不断使用该套流程去验证这套架构设计流程方法论。

上一篇 下一篇

猜你喜欢

热点阅读