笔记之架构的本质

406 阅读7分钟

本文来自极客时间《架构实战案例解析》--王庆友

架构的本质

架构的本质是:通过合理的内部编排,保证复杂系统高度有序,能够不断扩展,满足业务和技术的变化。

  • 保证复杂系统有序

首先,架构的出发点是业务和技术不断复杂化,引起系统混乱,从而需要通过架构来保证有序。

搭一个草房子很简单,可以直接上手;盖一个 2 层楼房,稍微复杂一些,但在工匠的经验 指导下,问题也不大;而盖一座高楼,复杂性就大不一样了,我们需要考虑内部结构、承重、采光、排水、防雷抗震等,这就需要专业人员事先做好整体的架构设计,并严格地按照设计来施工。

可以看到,建筑里的架构不是天然就有的,而是因为建筑越来越复杂,我们需要通过架构来管理这种复杂性,避免建造过程的失控。

软件系统也是如此,从简单的桌面应用发展到现在的大型互联网平台,这个过程中,系统规模越来越大,业务和技术也越来越复杂。我们同样需要通过架构设计,消化复杂性带来的混乱,使系统始终处于一个有序状态,能够应对现有和将来的需求变化。

  • 内部编排保证有序

其次,架构实现从无序到有序,是通过合理的内部编排实现的,基本的手段,就是“分”与“合”,先把系统打散,然后将它们重新组合,形成更合理的关系。

“分”就是把系统拆分为各个子系统、模块、组件。我们比较熟悉的微服务架构,就是一种典型的拆分做法。

“合”就是基于业务流程和技术手段,把各个组件有机整合在一起。比如说在微服务架构中,拆分为具体微服务后,我们需要对这些服务进行归类和分层。

举个例子,在 Builder 设计模式中,它的主逻辑是将各个部件组装起来,它不关心创建某个具体部件的内部逻辑,它承担的是合的部分;工厂模式负责细粒度的构造逻辑,承担的是分的部分。大家各自管理自己的复杂性。

架构的分类

可以分为业务架构、应用架构和技术架构。

通常有很多种分法,这只是其中一种。

那么,这些架构分别为谁服务,解决什么问题?

通过一个系统的落地,首先需要人来开发,然后由机器来运行,人和机器共同参与一个系统的落地。

image-20210720233257939

人可能会遇到的问题:业务太复杂,系统后续维护困难;架构追求的是系统概念清晰,业务逻辑容易理解,从而使人可以直观地进行代码开发。

机器可能会遇到的问题:外部请求并发量太大,机器扛不住;架构要求的是系统能够水平扩展,支持硬件容错,保证系统的高性能和高可用。

这里,开发的痛点主要由业务架构和应用架构来解决,机器的痛点主要由技术架构来解决。

  • 业务架构

业务架构就是讲清楚核心业务的处理过程,定义各个业务模块的相互关系,它从概念层面帮助我们理解系统面临哪些问题以及如何处理;

  • 应用架构

应用架构就是讲清楚系统内部是怎么组织的,有哪些应用,相互间是怎么调用的,它从逻辑层面帮助我们理解系统内部是如何分工与协作的。

  • 技术架构

技术架构就是讲清楚系统由哪些硬件、操作系统和中间件组成,它们是如何和我们开发的应用一起配合,应对各种异常情况,保持系统的稳定可用。它从物理层面帮助我们理解系统是如何构造的,以及如何解决稳定性的问题。

举一个电商的例子。

比如一个商品业务,可能对应 3 个应用,一个前台商品展示应用、一个后台商品管理应用,以及一个商品基础服务。

业务架构定义了一个下单的具体流程;应用架构定义了下单有哪些应用参与以及它们如何协作;技术架构要保障相关的应用能够处理高并发,从而保证大促顺利进行。

举一个拍电影的例子。

业务架构定义了这个电影的故事情节和场景安排;应用架构定义了有哪些角色及其职责,在每个场景中,这些角色是如何互动的;技术架构确定这些角色由谁来表演,物理场景上是怎么布置的,以此保证整个拍摄能够顺利完成。

什么是好的架构?

一个好的架构必须满足两方面挑战:业务复杂性和技术复杂性。

  • 业务复杂性

系统架构首先要满足当前的业务需求,还要满足将来的业务需求,系统要能不断地扩展变化,包括调整现有功能,以及增加新功能。(扩展性)

而且,系统的功能变化不能影响现有业务,不要牵一发动全身。因此,在架构设计上,要做到系统的柔性可扩展,能够根据业务变化做灵活的调整。(扩展性)

此外,上新业务功能,需要短时间就能落地。因此,架构设计上,还要做到系统功能的可重用,这样才能通过快速复用,实现业务敏捷和创新。(可重用)

  • 技术复杂性

要保证一个业务能正常运行,还要保证这个系统稳定可用。

一个复杂系统是由很多部分组成的,如应用程序、服务器、数据库、网络、中间件等,都可能会出问题。那怎么在出问题时,能够快速恢复系统或者让备用系统顶上去呢?(高可用)

还有流量问题,平时流量不大,少量机器就可以处理,但在大促的时候,大量流量进来,系统是不是能够通过简单地加机器方式就能支持呢?(高并发)

此外还有低成本的问题,系统能否做到,使用廉价设备而不是高大上的 IOE 设备,使用免费的开源组件而不是昂贵的商业套件,使用虚拟化技术而不是物理机。(低成本)

什么是好的架构师?

一个优秀的架构师,应具备很强的综合能力。

image-20210720225454505

  • 抽象思维

抽象思维是架构师最重要的能力,架构师要善于把实物概念化并归类。比如,面对一个大型的 B2C 网站,能够迅速抽象为采购 -> 运营 -> 前台搜索 -> 下单 -> 履单这几大模块,对系统分而治之。

  • 透过问题看本质

透过问题看本质是由事物的表象到实质,往深层次挖掘。比如,看到一段 Java 代码,知道它在 JVM 中如何执行;一个跨网络调用,知道数据是如何通过各种介质(比如网卡端口)到达目标位置。

  • 多领域知识和技术前瞻性

架构师要有技术的广度(多领域知识)和深度(技术前瞻)。对主流公司的系统设计非常了解,知道优劣长短,碰到实际问题,很快就能提供多种方案供评估。

  • 沟通交流

能落地的架构才是好架构,架构师还需要具备良好的沟通能力,能确保各方对架构达成共识,愿意采取一致的行动。

  • 平衡取舍

良好的平衡取舍能力,可以确保架构在现有资源约束下是最合理的,能让理想最终照进现实。