对于想要入门架构的小白来说,我们必须要了解以下问题:
系统:泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能单独完成的工作的群体。比如微信就是一个系统
顶层结构:系统可分为系统与子系统,差别在于系统可能是另外一个大系统的子系统。比如微信系统中还包含聊天、登录、支付、朋友圈等子系统。所以顶层结构更好地来将它们区分开来,避免架构层次混乱
不包括的方面:需求的详尽分析(所有功能需要在设计架构前已经分析清楚,架构师当然需要甄别需求,但软件架构需要基于清晰的需求)、系统中的实现细节(如聊天系统中使用哪种消息加密方式,这是详细设计中需要做的但不应该包含在顶层结构的设计,除非实现方式比较特殊直接影响到架构)
架构产生的直接原因是为了实现一个系统来完成业务需求,那么必定会带来一定的系统复杂度,从而衍生出一系列问题。我们做架构,就是需要提前将这些问题预想到并给出解决方案,这样才算一个合格的架构师
举一个学生管理系统的例子,需求是登录、注册、成绩管理、课程管理。我们一拿到这个需求的时候,首先需要识别出复杂度在哪里,然后给出一些解决方案
所以该系统复杂度主要体现在存储的可靠性上,多使用一台服务器作为备库是最简单的解决方案,至于是否还需要另外的数据备份方式依情况而定
这个例子就是我们作为架构师的入门案例,我们通过对学生管理系统的架构进行设计,分析出了复杂度在哪里,并给与了解决方案,达到了架构的目的,但现实情况往往比较复杂,问题更多,我们需要一个更加系统的分析流程来进行架构
想要对问题进行分析,那么首先需要知道问题产生的原因,现在我们来了解一下架构的复杂度来源
除开硬件,操作系统就是发挥出高性能的关键,进程与线程则是操作系统中性能影响最大的方面,比如我们为了追求高性能,需要考虑多线程、多进程、进程间通信、多线程并发,还需要结合实际场景选择合适的方案
集群作为 任务分配 的使用方式:能够突破单台服务器的极限性能,通过增加更多的服务器来满足性能要求。比如一台Nginx服务器加几百台Web服务器确实可以达到一定程度的高性能服务,但不能充分发挥出服务器集群的极限性能,因为服务器之间除了分担流量,毫无配合。
任务分配的意思是指每台机器都可以处理完整的业务任务,不同的任务分配到不同的机器上执行。一个任务分配器(Nginx、LVS)加上几个业务服务器就能完成这种架构,但详细来讲,任务分配器还需要进行一些配置(跟业务服务器的连接方式、动态更新配置、选择合适的分配算法)
当流量变大,一个任务分配器也是不够用的,需要一个任务分配集群,然后在任务分配集群前加上DNS轮询进行请求分配;业务服务器的数量也会大大增加,增加了管理的难度
集群作为 任务分解 的使用方式:由于业务变得复杂起来,一个请求可能会有很多不同的事情需要后台处理,比如消耗CPU的计算,消耗网络和磁盘IO的数据传输,所以将不同的功能对应到不同子系统中,然后针对不同业务的不同性能需求,分别进行独立的优化。这样不需要对整个系统进行修改,仅仅影响某个业务。这其实就是将单体应用拆分成若干小服务的做法,跟微服务类似,小服务也不能太多,否则会因为服务之间的消息传递大大降低性能
高可用指的是 系统无中断地执行其功能的能力,代表系统的可用性程度 。 无中断 是高可用性的难点所在, 冗余 是做到 无中断 的方法,简单说就是多弄几台服务器当做备份,所以复杂度因此而生。
计算指的是业务逻辑处理,无论在哪台服务器上计算都是一样的结果,所以这里的复杂度与【高性能】中的集群复杂度是类似的,不再赘述
与计算高可用的区别在于,复杂度除开在集群的搭建,还在数据的一致性上。分布式系统中数据的不一致很可能导致业务不可用或者用户体验极差
以上是在技术方面需要考虑到的架构问题,但架构师并不是只需要技术就能无敌于天下的,这是100offer提供的【架构师该具备什么能力才能成为一家公司中的「灵魂人物」】的调查图
可以看出,设计能力与技术能力是架构师的核心能力,占的比重较大,本系列文章也将着重对这两方面能力进行深入,但还有很多其他能力也必不可少,因为从接收需求到实施架构的过程中会有非常多的流程,比如讨论需求、讨论方案、讲解方案、总结汇报、日程安排。沟通表达、总结、管理能力显得格外重要。
这些软技能都不是一朝一夕能够学得的,需要大量的主动练习才能有所长进,同时本人推荐《软技能 代码之外的生存指南》可以作为学习指南参考
https://time.geekbang.org/column/intro/81
https://www.zhihu.com/question/40520339最近在总结一些针对 Java 面试相关的知识点,感兴趣的朋友可以一起维护~
地址: https://github.com/xbox1994/2018-Java-Interview