知识卡片

可扩展的基本思想是"拆",及三种拆分思路的范围关系

结构图卡

内容

软件系统和硬件、建筑最根本的差异在于软件天生是可扩展的——一颗CPU生产出来就不会再回工厂加功能,一座金字塔矗立千年结构从未改变,但一个软件系统如果开发出来后再也没有更新迭代,反而说明它没有生命力,真正有生命力的系统(如Windows从3.0一路演化到10)都在持续发展。这种天生的可扩展性既是软件的魅力所在,也是难点所在:魅力在于可以不断通过修改扩展让系统跟上新需求;难点在于如何以最小代价完成扩展,因为很多时候牵一发动全身,扩展时到处都要改、到处都要推倒重来,改动范围越大,投入越大、出错概率也越大。可扩展性架构设计万变不离其宗,背后的核心思想可以归结为一个字:”拆”——把原本大一统的系统拆成多个小规模部分,扩展时只需要动其中一部分,不用整个系统到处改,从而缩小改动范围、降低改动风险。但软件系统的”拆”和日常生活里用推土机拆房子、用剪刀拆快递这种破坏性的拆完全不同,软件的拆是建设性的——目标不是摧毁系统,而是让系统变得更优美、更具备可扩展性,因此难度要高得多。按不同思路拆分软件系统,会得到不同架构,常见的拆分思路有三种,理解它们的关键是弄清”流程”“服务”“功能”三者的范围关系:从大到小依次是流程>服务>功能。以TCP/IP协议栈为例:流程对应”应用层→传输层→网络层→物理和数据链路层”这个不管应用层具体是什么、都固定不变的通信流程;服务对应应用层里的HTTP、FTP、SMTP这类具体服务(HTTP提供Web服务、FTP提供文件服务、SMTP提供邮件服务);功能对应每个服务内部更细粒度的能力(HTTP的GET/POST、FTP的上传下载、SMTP的邮件收发)。据此,面向流程拆分是把整个业务流程切成若干阶段、每个阶段作为一部分;面向服务拆分是把系统提供的各类服务分别独立出来;面向功能拆分是把每个服务内部提供的具体功能进一步拆细。

结构图

flowchart TB
  A["可扩展架构的基本思想:拆"]
  A --> B["三种拆分思路,范围从大到小"]
  B --> C["面向流程拆分<br/>如TCP/IP:应用层→传输层→网络层→物理数据链路层"]
  B --> D["面向服务拆分<br/>如应用层内:HTTP/FTP/SMTP各自独立服务"]
  B --> E["面向功能拆分<br/>如HTTP服务内:GET/POST等细粒度功能"]
  C --> F["流程 > 服务 > 功能"]
  D --> F
  E --> F

参考来源

- 位置:《从零开始学架构》第32讲《可扩展架构的基本思想和模式》"可扩展的基本思想"(源文件:_epub-src/OEBPS/text00002.html) - 结论依据:原文说明"所有的可扩展性架构设计,背后的基本思想都可以总结为一个字:拆!""软件系统中的'拆'是建设性的,因此难度要高得多",并以TCP/IP协议栈为例逐一解释流程、服务、功能三者的区别与联系,指出"从范围上来看,从大到小依次为:流程 > 服务 > 功能",直接支撑本卡片结论与结构图。 - 原始内容:所有的可扩展性架构设计,背后的基本思想都可以总结为一个字:拆!……软件系统中的"拆"是建设性的,因此难度要高得多……从范围上来看,从大到小依次为:流程 > 服务 > 功能。