.Software.Architecture.The.Hard.Parts.

研究背景

  1. 研究问题:本文研究了现代分布式架构中的软件架构设计问题,特别是如何在没有“最佳实践”的情况下进行架构决策。作者探讨了架构量子(architecture quantum)的概念,分析了静态和动态耦合,并提出了如何进行架构分解和组件化。
  2. 研究难点:该问题的研究难点包括:分布式架构的复杂性、耦合度的评估、服务粒度的确定、数据所有权和管理、事务处理等。
  3. 相关工作:相关工作包括对传统单体架构的研究,以及对微服务架构的探讨。本文在此基础上进一步细化了架构量子(architecture quantum)的概念,并提出了具体的分解和组件化方法。

研究方法

这篇论文提出了一套用于解决分布式架构中软件架构设计问题的方法。具体来说,

  1. 架构量子(Architecture Quantum):首先,定义了架构量子(architecture quantum)的概念,它是一个独立部署的、具有高功能内聚性、高静态耦合和高同步动态耦合的单元。架构量子帮助确定服务的边界和耦合度。

     

  2. 静态耦合与动态耦合:将耦合分为静态耦合和动态耦合。静态耦合指的是服务之间的依赖关系,而动态耦合指的是服务在运行时的通信方式。静态耦合通过合同(contracts)来表示,而动态耦合则通过通信方式(如同步或异步)来实现。

  3. 组件化分解:提出了组件化分解的方法,包括识别和大小调整组件模式、收集公共域组件模式、展平组件模式、确定组件依赖模式、创建组件域模式和创建域服务模式。这些模式帮助将单体应用分解为独立的、可部署的服务单元。

     

  4. 数据分解:讨论了如何将单体数据库分解为多个数据域,并选择合适的数据库类型。数据分解的驱动力包括变更控制、连接管理、可扩展性、容错性、架构量子和数据库类型优化。

     

实验设计

本文通过一个实际案例——Sysops Squad票务系统,展示了所提出方法的应用。实验设计包括以下几个步骤:

  1. 数据收集:收集了Sysops Squad系统的现有数据模型和组件信息。

  2. 实验设计:将Sysops Squad系统分解为多个独立的域服务,并对每个服务的粒度进行调整。

     

  3. 样本选择:选择了Sysops Squad系统中的关键功能模块,如票务处理、客户注册、报告生成等。

  4. 参数配置:为每个服务的粒度和数据库类型配置了相应的参数,以确保系统的性能和可扩展性。

结果与分析

  1. 服务粒度:通过实验,确定了每个服务的最佳粒度。例如,票务处理功能被分解为多个子服务,以提高灵活性和可扩展性。

     

  2. 数据库分解:成功将Sysops Squad数据库分解为多个数据域,并选择了适合每种数据域的数据库类型。例如,客户调查数据被迁移到文档数据库中,以提高查询性能和灵活性。

     

  3. 性能提升:通过分解和组件化,系统的响应时间和吞吐量得到了显著提升。例如,票务处理服务的响应时间减少了约30%。

  4. 可扩展性:系统的可扩展性也得到了改善,能够更好地应对突发的高并发请求。

     

总体结论

本文提出了一套系统的、可操作的方法,用于解决分布式架构中的软件架构设计问题。通过引入架构量子的概念,分析了静态和动态耦合,并提出了具体的组件化分解和数据分解方法。实验结果表明,这些方法能够显著提高系统的性能、可扩展性和灵活性。本文的贡献在于提供了一套实用的工具和方法论,帮助架构师在复杂的分布式环境中做出更好的决策。

 

论文评价

优点与创新

  1. 全面性:本书详细探讨了分布式架构中的各种难题,提供了全面的解决方案和实用的指导。
  2. 实用性:书中通过实际案例(如Sysops Squad的故事)来解释抽象概念,使得理论更加易于理解和应用。
  3. 决策框架:提出了“最少最坏组合”的设计原则,帮助建筑师在面对复杂问题时做出更好的决策。
  4. 架构健身函数:介绍了如何通过自动化工具来验证架构设计的正确性,确保设计原则得以实施。
  5. 数据驱动:强调了数据在架构决策中的重要性,提供了关于操作数据和分析数据的详细讨论。
  6. 模块化分解模式:提供了一套结构化的方法来分解单体应用,形成分布式架构,包括识别和大小组件模式、收集公共域组件模式等。
  7. 服务粒度分析:通过实例(如票证分配和客户注册)展示了如何确定服务的适当粒度,平衡了灵活性和性能。
  8. 代码重用模式:讨论了在分布式架构中管理代码重用的多种技术,包括代码复制、共享库、共享服务和Sidecar模式。

不足与反思

  1. 代码复制技术的局限性:虽然代码复制技术在某些情况下有用,但难以管理和更新共享代码,增加了开发和部署的复杂性。
  2. 共享库的粒度和版本控制:共享库的粒度选择和版本控制是一个挑战,过粗的粒度会增加依赖管理的复杂性,而过细的粒度会增加变更控制的难度。
  3. 共享服务的风险:共享服务的变更具有很高的风险,可能会影响整个系统,特别是在运行时变更的情况下。
  4. 未来工作:作者提到未来的工作可以进一步探讨如何在分布式架构中更好地管理代码重用,特别是如何在保持解耦的同时减少共享代码的风险。
 

关键问题及回答

问题1:架构量子(Architecture Quantum)的概念在本文中是如何定义和应用的?

架构量子(Architecture Quantum)被定义为独立部署的具有高功能内聚性、高静态耦合和高同步动态耦合的单元。具体公式如下:

Architecture Quantum=Independent Deployable Artifact with High Functional Cohesion, High Static Coupling, and Synchronous Dynamic CouplingArchitecture Quantum=Independent Deployable Artifact with High Functional Cohesion, High Static Coupling, and Synchronous Dynamic Coupling

架构量子的概念帮助建筑师在分布式系统中确定服务的边界和粒度,确保每个服务都具有高度的独立性和内聚性。通过这种方式,可以更好地管理服务的耦合度和通信方式,从而实现系统的可扩展性和灵活性。

问题2:在组件化分解过程中,本文提出了哪些具体的模式和策略?

  1. 识别和大小调整组件:通过计算组件的语句数量和代码百分比,确定组件的大小并进行调整。
  2. 收集公共域组件:将多个组件中的公共业务逻辑提取到单个共享组件中,减少重复服务。
  3. 扁平化组件:将嵌套的组件结构扁平化,确保每个组件只包含单一的层次结构。
  4. 确定组件依赖关系:分析组件之间的依赖关系,确定是否可以独立部署和调整。
  5. 创建组件域:将相关的组件分组到逻辑域中,形成更粗粒度的域服务。
  6. 创建域服务:将组件域进一步拆分为独立的域服务,每个服务负责特定的业务功能。

这些模式和策略帮助建筑师在分布式系统中逐步分解和重构单体应用,从而实现更灵活和可维护的系统架构。

问题3:本文在数据分解方面提出了哪些具体的方法和步骤?

  1. 分析数据库并创建数据域:识别数据库中的特定域组,并将相关表分组到不同的数据域中。
  2. 分配表到数据域:将属于特定数据域的表移动到相应的模式中。
  3. 分离数据库连接到数据域:重构每个服务的数据库连接逻辑,确保它们只连接到其数据域。
  4. 移动模式到独立的数据库服务器:将数据域移动到独立的物理数据库服务器上。
  5. 切换到独立的数据库服务器:断开与旧数据库服务器的连接,完成数据域的独立部署。

通过这些步骤,本文实现了单体数据库的分解,提升了系统的可扩展性和容错能力,并允许选择更适合特定需求的数据库类型。

 
 
-------------------------------------------------
《Software Architecture: The Hard Parts》是一本深入探讨软件架构中难题的书籍,通过实际案例和详细的分析,为读者提供了宝贵的见解和解决方案。以下是对这本书的深度阅读分析:

  1. 内容结构:
    • 引言部分:提出软件架构中存在许多难以解决的问题,缺乏通用的最佳实践,需要架构师进行权衡和决策。
    • 第一部分:Pulling Things Apart:详细介绍了如何将单体应用分解为分布式架构,包括组件分解、数据分解和确定服务粒度等内容。
    • 第二部分:Putting Things Back Together:探讨了在分布式架构中如何管理服务通信、合同、分布式工作流、分布式事务、数据所有权和数据访问等问题。
  2. 关键概念和技术:
    • 组件分解模式:包括识别和调整组件、确定组件依赖关系、创建组件域以及将组件域移动到单独的服务中。这些模式有助于将单体应用逐步分解为可独立部署和维护的服务。
    • 数据分解:涉及确定数据分解的驱动因素,如变更控制、连接管理、可扩展性等,然后通过创建数据域、分配表到数据域、分离数据库连接等步骤来实现数据的分解。
    • 服务粒度:确定服务粒度的关键因素包括服务范围和功能、代码波动性、可扩展性等,同时需要考虑数据库事务、工作流和编排、共享代码和数据关系等集成驱动因素。
    • 代码复用模式:包括代码复制、共享库、共享服务和边车模式,以及如何在分布式架构中管理代码复用,需要权衡各种模式的优缺点,根据实际情况选择合适的代码复用方式。
    • 数据所有权和分布式事务:分配数据所有权时需要考虑单所有权、共同所有权和联合所有权等场景,分布式事务管理涉及 ACID 和 BASE 事务、最终一致性模式等,需要根据业务需求和系统特点来选择合适的事务管理方式。
    • 分布式数据访问模式:包括服务间通信、列模式复制、复制缓存和数据域等模式,需要根据数据访问需求、性能要求和系统架构来选择合适的数据访问模式。
    • 分布式工作流管理:包括编排和编排通信风格,需要权衡两者的优缺点,根据工作流的复杂性、性能要求和可扩展性来选择合适的工作流管理方式。
  3. 案例分析:
    • Sysops Squad 案例:贯穿全书的 Sysops Squad 案例,详细展示了在实际应用中如何应用各种架构模式和技术来解决问题。例如,在分解单体应用时,如何确定组件和服务的边界,如何处理数据所有权和分布式事务,以及如何选择合适的数据访问模式和工作流管理方式。
    • 其他案例:书中还引用了其他一些实际案例,如保险公司的客户信息管理案例,用于说明在不同场景下如何进行架构决策和权衡。
  4. 实践指导意义:
    • 架构决策:书中提供了许多关于架构决策的指导,包括如何分析问题、确定权衡因素、评估各种解决方案的优缺点,以及如何做出最合适的决策。
    • 技术选型:在选择具体的技术和工具时,需要考虑到项目的需求、团队的技术能力、系统的可扩展性和维护性等因素。例如,在选择数据库类型时,需要考虑到数据的特点、访问模式、性能要求等因素。
    • 团队协作:强调了团队协作在软件架构中的重要性,包括架构师与开发团队、数据库团队、业务部门等之间的协作。只有通过良好的团队协作,才能更好地理解业务需求,做出合理的架构决策。
  5. 局限性和挑战:
    • 复杂性:软件架构涉及到许多复杂的因素和技术,对于初学者来说可能难以理解和应用。
    • 不确定性:在实际应用中,往往存在许多不确定性因素,如业务需求的变化、技术的发展等,这可能会导致架构决策的困难。
    • 权衡的难度:在进行架构决策时,需要权衡许多因素,如性能、可扩展性、可维护性等,这往往是一个非常困难的过程,需要架构师具备丰富的经验和敏锐的判断力。
  6. 与其他相关书籍的比较:
    • 与《Fundamentals of Software Architecture》的比较:《Fundamentals of Software Architecture》更侧重于介绍软件架构的基本概念和原则,而本书则更深入地探讨了软件架构中的难题和挑战,以及如何解决这些问题。
    • 与《Designing Data - Intensive Applications》的比较:《Designing Data - Intensive Applications》主要聚焦于数据密集型应用的设计,包括数据存储、数据处理、数据一致性等方面,而本书则更全面地涵盖了软件架构的各个方面,包括组件分解、服务粒度、分布式事务等。

总的来说,《Software Architecture: The Hard Parts》是一本非常有价值的书籍,对于软件架构师和开发者来说,具有很强的指导意义。通过深入阅读和理解本书的内容,可以帮助读者更好地应对软件架构中的难题,做出更明智的架构决策。
 
 
分享一下关于组件分解模式的实际案例
 
以下是关于组件分解模式的实际案例,以书中提到的 Sysops Squad 应用为例:

Sysops Squad 应用背景:
Sysops Squad 是一个大型电子公司的支持系统,负责处理客户的问题票、提供专家支持、管理客户信息等。该应用最初是一个单体应用,随着业务的发展,需要将其分解为分布式架构。

组件分解模式的应用过程:

  1. Identify and Size Components Pattern(识别和调整组件模式):
    • 识别组件:分析 Sysops Squad 应用的功能,确定了如登录、计费、客户通知、票务等组件。
    • 调整组件:例如,通过分析发现报表组件的功能过于复杂,将其拆分为票务报表、专家报表和财务报表等更细粒度的组件。
  2. Gather Common Domain Components Pattern(收集共同领域组件模式):
    • 发现共同组件:发现客户通知功能中,虽然通知方式有多种(如短信、邮件、邮寄信件),但它们都属于通知的范畴,可归为一个共同组件。
    • 整合共同组件:将这些通知方式的相关代码整合到一个共同组件中,减少了代码的重复。
  3. Flatten Components Pattern(扁平化组件模式):
    • 识别层次结构:发现 Sysops Squad 应用中存在一些组件之间的层次结构不合理的情况,例如,票务组件中的一些子组件被隐藏在较深的层次中。
    • 扁平化结构:将这些隐藏的子组件提取出来,使其成为独立的叶节点组件,从而实现了组件结构的扁平化。
  4. Determine Component Dependencies Pattern(确定组件依赖关系模式):
    • 分析依赖关系:通过对 Sysops Squad 应用中各个组件的分析,确定了它们之间的依赖关系。例如,票务分配组件依赖于专家信息组件,而票务路由组件又依赖于票务分配组件。
    • 绘制依赖图:使用工具绘制出组件依赖图,直观地展示了组件之间的依赖关系,有助于发现潜在的问题。
  5. Create Component Domains Pattern(创建组件域模式):
    • 划分域:根据业务功能和组件依赖关系,将 Sysops Squad 应用划分为票务、客户、报告、管理等组件域。
    • 调整命名空间:对组件的命名空间进行调整,使其与组件域的划分相匹配,提高了代码的可读性和可维护性。
  6. Create Domain Services Pattern(创建域服务模式):
    • 提取服务:将各个组件域中的组件提取出来,创建为独立的域服务。例如,将票务组件域中的票务创建、分配、路由等组件提取出来,创建为票务服务。
    • 部署服务:将这些域服务部署到不同的服务器上,实现了分布式架构。

结果和收益:
通过应用组件分解模式,Sysops Squad 应用成功地从单体架构转变为分布式架构,提高了系统的可扩展性、可维护性和可靠性。同时,通过合理的组件划分和整合,减少了代码的重复,提高了开发效率。

这个案例展示了组件分解模式在实际应用中的具体步骤和效果,能够帮助读者更好地理解和应用该模式。
 
 
posted @ 2024-09-06 22:25  parkdifferent  阅读(36)  评论(0编辑  收藏  举报