<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>架构权衡 on 方糖猫Blog</title>
    <link>https://ftmao.com/blog/tags/%E6%9E%B6%E6%9E%84%E6%9D%83%E8%A1%A1/</link>
    <description>AI 视频、AI Agent 与工程实践笔记</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Wed, 26 Jul 2023 14:00:00 +0800</lastBuildDate><atom:link href="https://ftmao.com/blog/tags/%E6%9E%B6%E6%9E%84%E6%9D%83%E8%A1%A1/index.xml" rel="self" type="application/rss+xml" /><item>
      <title>《软件架构：最难的部分》详解：分布式架构的权衡分析实战指南</title>
      <link>https://ftmao.com/blog/bookstore/software-architecture-hard-parts-book-notes/</link>
      <pubDate>Wed, 26 Jul 2023 14:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/bookstore/software-architecture-hard-parts-book-notes/</guid>
      <description>&lt;h1 id=&#34;软件架构最难的部分详解分布式架构的权衡分析实战指南&#34;&gt;《软件架构：最难的部分》详解：分布式架构的权衡分析实战指南&lt;/h1&gt;
&lt;p&gt;《软件架构：最难的部分》（Software Architecture: The Hard Parts: Modern Trade-Off Analyses for Distributed Architectures）是 O&amp;rsquo;Reilly 在 2021 年出版的一本架构书，四位作者都是业内响当当的人物：Neal Ford（《软件架构 fundamentals》作者之一）、Mark Richards（资深架构师、《软件架构 fundamentals》合著者）、Pramod Sadalage（数据库演进专家）和 Zhamak Dehghani（&amp;ldquo;数据网格&amp;quot;概念的提出者）。&lt;/p&gt;
&lt;p&gt;这本书回答了一个非常现实的问题：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;当我把一个单体系统拆成微服务时，每一步到底该怎么拆？怎么知道拆得对不对？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;市面上的架构书大多告诉你&amp;quot;什么是好架构&amp;rdquo;，却很少教你&amp;quot;做决策的过程&amp;quot;。这本书补上了这块空白。它的核心立场是：&lt;strong&gt;架构里不存在&amp;quot;最佳实践&amp;quot;，只存在&amp;quot;权衡分析&amp;quot;（Trade-off Analysis）&lt;/strong&gt;。每一个决策都是在拿一些东西换另一些东西，架构师的工作就是把交换的条件摆清楚。&lt;/p&gt;
&lt;p&gt;本文面向&lt;strong&gt;从未接触过软件架构概念&lt;/strong&gt;的读者，按全书十五章的顺序逐层展开，配合图解和实例，帮你建立完整的知识地图。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-1-章-当没有最佳实践时会发生什么&#34;&gt;第 1 章 当没有&amp;quot;最佳实践&amp;quot;时会发生什么&lt;/h2&gt;
&lt;h3 id=&#34;一切皆权衡&#34;&gt;一切皆权衡&lt;/h3&gt;
&lt;p&gt;作者开篇就泼了一盆冷水：如果有人问你&amp;quot;微服务和单体哪个好&amp;quot;，唯一正确的回答是——&lt;strong&gt;看情况&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;架构决策和买东西很像。假如有人不问预算、不问用途，直接告诉你&amp;quot;买这辆车是最好的&amp;quot;，你肯定会觉得他不靠谱。架构也一样：任何脱离上下文的&amp;quot;最佳实践&amp;quot;都是耍流氓。架构师真正的工作流程是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;找到决策涉及的各个维度（性能、成本、耦合度、团队结构……）；&lt;/li&gt;
&lt;li&gt;分析每个维度上的得与失；&lt;/li&gt;
&lt;li&gt;把分析结果呈现给利益相关者，让他们在知情的情况下做选择。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以这本书的副标题才是&amp;quot;现代分布式架构的权衡分析&amp;quot;——&lt;strong&gt;最难的部分不是技术本身，而是权衡&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;贯穿全书的案例sysops-squad-工单系统&#34;&gt;贯穿全书的案例：Sysops Squad 工单系统&lt;/h3&gt;
&lt;p&gt;为了方便讲解，作者虚构了一个贯穿全书的案例。Sysops Squad 是一家 IT 运维支持公司，客户（通常是企业的 IT 部门）遇到设备故障时提交&lt;strong&gt;工单（Ticket）&lt;/strong&gt;，系统把工单分配给合适的运维专家（Sysop），专家上门或远程修复，完成后填写处理报告。&lt;/p&gt;
&lt;p&gt;他们现在用的是一个大单体应用，随着业务增长越来越痛苦：改一个小功能要全量发布、一个模块的 bug 拖垮整个系统、高峰期扩容只能整体扩容。于是团队决定把它拆成微服务——&lt;strong&gt;这本书讲的就是这一路上遇到的每一个&amp;quot;难啃的骨头&amp;quot;&lt;/strong&gt;。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    subgraph 拆分前[&amp;#34;拆分前：单体应用&amp;#34;]
        M[&amp;#34;Sysops Squad 单体系统&amp;lt;br/&amp;gt;工单 + 用户 + 派单 + 报告 + 计费&amp;lt;br/&amp;gt;共享一个大数据库&amp;#34;]
    end
    subgraph 拆分后[&amp;#34;拆分后：微服务&amp;#34;]
        A[&amp;#34;工单服务&amp;#34;]
        B[&amp;#34;用户服务&amp;#34;]
        C[&amp;#34;派单服务&amp;#34;]
        D[&amp;#34;报告服务&amp;#34;]
        E[&amp;#34;计费服务&amp;#34;]
        DB1[(&amp;#34;工单库&amp;#34;)]
        DB2[(&amp;#34;用户库&amp;#34;)]
        DB3[(&amp;#34;派单库&amp;#34;)]
        DB4[(&amp;#34;报告库&amp;#34;)]
        DB5[(&amp;#34;计费库&amp;#34;)]
        A --- DB1
        B --- DB2
        C --- DB3
        D --- DB4
        E --- DB5
    end
    拆分前 --&amp;gt;|本书要讲的全过程| 拆分后&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;看起来很美好对吧？但魔鬼全在细节里：组件怎么划？数据库怎么拆？服务粒度多细合适？公共代码怎么办？跨服务的事务和数据访问怎么办？——这些就是后面十四章要逐一解决的问题。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-2-章-识别软件架构中的耦合&#34;&gt;第 2 章 识别软件架构中的耦合&lt;/h2&gt;
&lt;h3 id=&#34;架构量子architecture-quantum&#34;&gt;架构量子（Architecture Quantum）&lt;/h3&gt;
&lt;p&gt;这是全书最重要的概念之一，也是后续所有分析的基本单位。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;架构量子&lt;/strong&gt;：系统中可以&lt;strong&gt;独立部署&lt;/strong&gt;的最小单元，包含它正常运行所必需的一切（代码、数据库、配置等）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;判断一个东西是不是一个架构量子，问三个问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;能独立部署吗？&lt;/strong&gt;（改完它不用动别的部分就能上线）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;功能内聚性高吗？&lt;/strong&gt;（它内部的代码是围绕同一个业务目标组织的）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;耦合度高吗？&lt;/strong&gt;（量子内部耦合高没关系，量子之间耦合低才是目标）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个单体应用就是一个架构量子；一套拆得干净的微服务，每个服务各自是一个量子；而&amp;quot;服务拆了但数据库还共享&amp;quot;的系统，量子边界其实还卡在数据库上——这是新手最容易掉进去的坑。&lt;/p&gt;
&lt;h3 id=&#34;静态耦合与动态耦合&#34;&gt;静态耦合与动态耦合&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;静态耦合&lt;/strong&gt;：编译期/部署期就能看到的依赖。比如 A 服务调用了共享库里的类，或者两个服务连同一个数据库 schema。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态耦合&lt;/strong&gt;：运行时才发生的调用关系。比如订单服务运行时调用支付服务的接口。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;动态耦合由三个维度决定，这是全书反复使用的分析框架：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;两个选项&lt;/th&gt;
					&lt;th&gt;权衡点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;通信（Communication）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;同步 / 异步&lt;/td&gt;
					&lt;td&gt;同步简单直观，异步解耦但复杂&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;一致性（Consistency）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;原子 / 最终&lt;/td&gt;
					&lt;td&gt;原子一致安全，最终一致可用性高&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;协调（Coordination）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;编排 / 编制&lt;/td&gt;
					&lt;td&gt;编排好管理，编制无中心瓶颈&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这三个维度像调色盘的三原色，后面讲工作流（第 11 章）和 Saga（第 12 章）时会反复用到。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-3-章-架构模块化&#34;&gt;第 3 章 架构模块化&lt;/h2&gt;
&lt;p&gt;为什么要模块化？作者给出了五个驱动力，每一个都对应一种&amp;quot;不模块化会疼&amp;quot;的场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;可维护性（Maintainability）&lt;/strong&gt;：大泥球代码改一处坏三处，模块化让改动范围可控。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可测试性（Testability）&lt;/strong&gt;：边界清晰的模块可以单独写测试，不用拉起整个系统。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可部署性（Deployability）&lt;/strong&gt;：小模块发布风险低、频率高；单体发布一次像发射火箭。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可扩展性（Scalability）&lt;/strong&gt;：旺季只有&amp;quot;下单&amp;quot;需要扩容，模块化后可以只扩这一个模块。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可用性与容错（Availability/Fault Tolerance）&lt;/strong&gt;：故障被限制在模块内部，不至于全站瘫痪。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;举个生活化的例子：老式组合音响里一个喇叭坏了，整台机器都得拆开修；而现在的家庭影院，功放、音箱、播放器各自独立，坏哪个换哪个——这就是模块化的价值。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-4-章-架构分解&#34;&gt;第 4 章 架构分解&lt;/h2&gt;
&lt;p&gt;拆分之前，先要学会&amp;quot;测量&amp;quot;耦合，而不是凭感觉。&lt;/p&gt;
&lt;h3 id=&#34;传入耦合与传出耦合&#34;&gt;传入耦合与传出耦合&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;传入耦合（Afferent Coupling）&lt;/strong&gt;：有多少别的组件依赖我？——衡量&amp;quot;我有多重要、改动我的风险有多大&amp;quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传出耦合（Efferent Coupling）&lt;/strong&gt;：我依赖多少别的组件？——衡量&amp;quot;我有多容易被别人拖累&amp;quot;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;主序列距离distance-from-the-main-sequence&#34;&gt;主序列距离（Distance from the Main Sequence）&lt;/h3&gt;
&lt;p&gt;这是 Robert C. Martin 提出的一组度量。想象一条坐标轴：横轴是&lt;strong&gt;抽象性&lt;/strong&gt;（组件里抽象类/接口占的比例），纵轴是&lt;strong&gt;不稳定性&lt;/strong&gt;（传出耦合占比）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个组件如果&lt;strong&gt;很具体但很多人依赖它&lt;/strong&gt;（比如工具类被全系统引用），它落在&amp;quot;痛苦区&amp;quot;：难改、一改全崩。&lt;/li&gt;
&lt;li&gt;一个组件如果&lt;strong&gt;很抽象但没人用&lt;/strong&gt;（比如过度设计的框架），它落在&amp;quot;无用区&amp;quot;。&lt;/li&gt;
&lt;li&gt;理想位置在两者之间的对角线（&amp;ldquo;主序列&amp;rdquo;）附近。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些度量不是让你拿计算器天天算，而是提供一个&lt;strong&gt;客观的拆分依据&lt;/strong&gt;：拆分候选的组件，先看它们的耦合度量，优先拆那些传入传出耦合低、边界清晰的——它们是&amp;quot;最容易摘下来的果子&amp;quot;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-5-章-基于组件的分解模式&#34;&gt;第 5 章 基于组件的分解模式&lt;/h2&gt;
&lt;p&gt;这是全书最&amp;quot;实操&amp;quot;的一章：怎么把一坨单体代码拆成组件？作者给出了一个六步流水线，每一步都有对应的&amp;quot;适应度函数&amp;quot;（自动化检查规则）来保证不跑偏。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    S1[&amp;#34;① 识别并确定组件大小&amp;lt;br/&amp;gt;盘点代码库里有哪些组件、各占多大比例&amp;#34;]
    S2[&amp;#34;② 收集公共组件&amp;lt;br/&amp;gt;把多个组件里重复出现的代码收拢到一处&amp;#34;]
    S3[&amp;#34;③ 扁平化组件&amp;lt;br/&amp;gt;把代码从根命名空间下沉到有明确职责的叶子节点&amp;#34;]
    S4[&amp;#34;④ 确定组件依赖&amp;lt;br/&amp;gt;画出组件依赖图，找出纠缠在一起的循环依赖&amp;#34;]
    S5[&amp;#34;⑤ 创建组件域&amp;lt;br/&amp;gt;把职责相近的组件归入同一个领域分组&amp;#34;]
    S6[&amp;#34;⑥ 创建领域服务&amp;lt;br/&amp;gt;每个领域组对外暴露成一个粗粒度服务&amp;#34;]
    S1 --&amp;gt; S2 --&amp;gt; S3 --&amp;gt; S4 --&amp;gt; S5 --&amp;gt; S6&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;几个步骤的直觉解释：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第①步&lt;/strong&gt;像搬家前盘点家当：先知道自己有什么。适应度函数可以自动检查&amp;quot;任何组件不得超过代码库总量的 X%&amp;quot;、&amp;ldquo;组件大小不得偏离平均值 N 个标准差&amp;rdquo;，防止拆出巨型组件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第②步&lt;/strong&gt;解决重复：如果&amp;quot;日志工具&amp;quot;&amp;ldquo;日期处理&amp;quot;在十个组件里各抄了一份，先把它们收拢，否则拆开后会十处同步改。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第③步&lt;/strong&gt;针对一种常见病：大量代码堆在根命名空间（比如所有代码都在 &lt;code&gt;com.sysops&lt;/code&gt; 下面不分层），说明系统从来没有真正的结构，必须先给每段代码找到归属。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第④步&lt;/strong&gt;是分水岭：依赖图里纠缠不清的组件（A 调 B、B 调 C、C 又调 A）说明领域边界划分有误，要回到业务层面重新划。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第⑤⑥步&lt;/strong&gt;完成从&amp;quot;代码组件&amp;quot;到&amp;quot;业务服务&amp;quot;的跃迁：同一域内的组件将来部署成一个服务，域与域之间的边界就是服务边界。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;**适应度函数（Fitness Function）**是本书反复强调的治理手段：把架构约束写成自动化测试，放进 CI 流水线。比如&amp;quot;报告域的组件不允许依赖计费域的组件&amp;quot;可以直接写成一条 ArchUnit 测试，谁违反了构建就失败——架构约束从&amp;quot;文档里的愿望&amp;quot;变成&amp;quot;会报警的护栏&amp;rdquo;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-6-章-拆分运营数据&#34;&gt;第 6 章 拆分运营数据&lt;/h2&gt;
&lt;p&gt;代码拆完，真正的硬骨头来了：&lt;strong&gt;数据库&lt;/strong&gt;。很多团队服务拆得很漂亮，底下却还用同一个数据库——等于楼分了户、水电还是一户一表，根本没有真正解耦。&lt;/p&gt;
&lt;h3 id=&#34;拆开数据库的推力与阻力&#34;&gt;拆开数据库的推力与阻力&lt;/h3&gt;
&lt;p&gt;作者在拆数据这件事上建立了一个&amp;quot;天平&amp;quot;模型：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;拆分驱动因素（Data Disintegrators，推着你拆）：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;变更控制：一个服务改表结构，不用和别的团队协调。&lt;/li&gt;
&lt;li&gt;连接管理：数据库连接数有限，服务多了必须分库。&lt;/li&gt;
&lt;li&gt;可扩展性：可以按服务单独扩容数据库。&lt;/li&gt;
&lt;li&gt;容错：一个库挂了只影响一个服务。&lt;/li&gt;
&lt;li&gt;架构量子：共享数据库会把量子边界撑破。&lt;/li&gt;
&lt;li&gt;数据库类型优化：不同服务适合不同数据库（工单用关系库，日志用时序库）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;整合因素（Data Integrators，拽着你不让拆）：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据关系：外键、JOIN 在跨库之后全部失效。&lt;/li&gt;
&lt;li&gt;数据库事务：跨库没有 ACID 事务，必须面对分布式事务的复杂性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;五步数据库分解法&#34;&gt;五步数据库分解法&lt;/h3&gt;
&lt;p&gt;书里给出了一个务实的渐进式拆分流程，核心思想是&amp;quot;&lt;strong&gt;先逻辑拆，再物理拆&lt;/strong&gt;&amp;quot;：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    P1[&amp;#34;① 分析数据库&amp;lt;br/&amp;gt;划分数据域&amp;#34;]
    P2[&amp;#34;② 把表分配到&amp;lt;br/&amp;gt;各数据域&amp;#34;]
    P3[&amp;#34;③ 数据库连接&amp;lt;br/&amp;gt;按域分离&amp;#34;]
    P4[&amp;#34;④ Schema 迁移到&amp;lt;br/&amp;gt;独立数据库服务器&amp;#34;]
    P5[&amp;#34;⑤ 切换到完全独立的&amp;lt;br/&amp;gt;数据库&amp;#34;]
    P1 --&amp;gt; P2 --&amp;gt; P3 --&amp;gt; P4 --&amp;gt; P5&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;关键是第③步：表还没物理分开，就先让各服务只连自己的 schema、只访问自己的表。这一步不动数据，只动代码和连接，风险小、可回滚。等代码层面确认拆分正确了，再做物理迁移（第④⑤步）。这种&amp;quot;小步快跑、每步可退&amp;quot;的思路贯穿全书。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-7-章-服务粒度&#34;&gt;第 7 章 服务粒度&lt;/h2&gt;
&lt;p&gt;拆服务时最纠结的问题：&lt;strong&gt;一个服务到底该多大？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;作者又祭出了&amp;quot;天平&amp;quot;分析法——这次叫粒度解耦因素（Granularity Disintegrators，推着你往细拆）与粒度整合因素（Granularity Integrators，拽着你往粗合）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;往细拆的理由（Disintegrators）：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;服务范围与功能&lt;/strong&gt;：一个服务只干一件事。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码波动性&lt;/strong&gt;：如果系统里&amp;quot;促销规则&amp;quot;每周改、&amp;ldquo;订单核心&amp;quot;半年不动，就该把促销拆出去，免得高频改动反复惊扰稳定部分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可扩展性与吞吐量&lt;/strong&gt;：只有搜索服务需要扛流量，拆细了才能单独扩容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容错&lt;/strong&gt;：非关键功能（比如推荐）挂了不该拖垮下单。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全&lt;/strong&gt;：处理支付的服务需要更高的安全等级和审计，独立出来好管控。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可扩展性（Extensibility）&lt;/strong&gt;：新功能以新服务的形式生长，不改老代码。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;往粗合的理由（Integrators）：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据库事务&lt;/strong&gt;：两个操作必须在同一个 ACID 事务里？那它们最好待在同一个服务里。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工作流与编制&lt;/strong&gt;：跨服务的编排/编制又慢又难调试，粒度太细会制造大量分布式工作流。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;共享代码&lt;/strong&gt;：两个服务共享大量代码，可能说明它们本来就该是一个。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据关系&lt;/strong&gt;：两个服务频繁访问彼此的数据，拆分带来的网络开销和一致性成本可能超过收益。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;实例&lt;/strong&gt;：Sysops Squad 拆出&amp;quot;工单服务&amp;quot;后，争论要不要把&amp;quot;工单指派&amp;quot;再拆成独立服务。分析后发现：指派逻辑改动频繁（每周调规则）、需要单独的弹性伸缩（早高峰派单量是平时的 5 倍）——两个 disintegrator 都很强；而它与工单共享的表只有一张、没有跨库事务需求——integrator 很弱。于是拆。反过来，&amp;ldquo;工单备注&amp;quot;功能没有任何独立的扩展和发布需求，就留在工单服务里。&lt;/p&gt;
&lt;p&gt;这就是权衡分析的样子：&lt;strong&gt;不是数哪边的理由多，而是掂量哪边的理由重&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-8-章-复用模式&#34;&gt;第 8 章 复用模式&lt;/h2&gt;
&lt;p&gt;多个服务都需要同一段代码（比如审计日志、认证），怎么办？书里给了四种方案：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;做法&lt;/th&gt;
					&lt;th&gt;优点&lt;/th&gt;
					&lt;th&gt;缺点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;代码复制&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;每个服务拷一份&lt;/td&gt;
					&lt;td&gt;零耦合、零依赖&lt;/td&gt;
					&lt;td&gt;改 bug 要改 N 处&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;共享库&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;打成 jar/npm 包共用&lt;/td&gt;
					&lt;td&gt;版本可控、无运行时开销&lt;/td&gt;
					&lt;td&gt;版本地狱、异构技术栈难共享&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;共享服务&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;独立部署一个公共服务&lt;/td&gt;
					&lt;td&gt;改动一处全生效、跨语言&lt;/td&gt;
					&lt;td&gt;网络开销、单点风险、变更影响面大&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Sidecar / 服务网格&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;功能放进每个服务的伴生容器&lt;/td&gt;
					&lt;td&gt;跨语言、运维统一&lt;/td&gt;
					&lt;td&gt;需要容器编排基础设施&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;选择思路很直接：&lt;strong&gt;变化越频繁、越偏向业务的代码，越不要共享&lt;/strong&gt;（宁肯复制）；&lt;strong&gt;越稳定、越偏向技术基础设施的能力&lt;/strong&gt;（日志、监控、鉴权），越适合共享或 Sidecar。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实例&lt;/strong&gt;：Sysops Squad 的&amp;quot;专家评分算法&amp;quot;每个服务都在用，但它每月都在调优——选了代码复制，各服务按需演进。而&amp;quot;日志采集&amp;quot;用了 Sidecar，统一由运维团队维护。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-9-章-数据所有权与分布式事务&#34;&gt;第 9 章 数据所有权与分布式事务&lt;/h2&gt;
&lt;p&gt;拆库之后立刻撞上两个难题：一张表被两个服务都要写，归谁？一个业务操作要跨两个服务写数据，怎么保证一致性？&lt;/p&gt;
&lt;h3 id=&#34;数据所有权&#34;&gt;数据所有权&lt;/h3&gt;
&lt;p&gt;先看所有权的两种场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单一所有权&lt;/strong&gt;：一张表只有一个服务写，其他服务最多只读——理想情况。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;共同所有权&lt;/strong&gt;：多个服务都要写同一张表——必须拆开归属。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;处理共同所有权有三种技术：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    subgraph 表拆分技术[&amp;#34;表拆分：按列拆开&amp;#34;]
        T1[&amp;#34;customer 表&amp;lt;br/&amp;gt;姓名/联系方式 → 档案服务&amp;lt;br/&amp;gt;信用额度/账单地址 → 计费服务&amp;#34;]
    end
    subgraph 数据域技术[&amp;#34;数据域：按行拆开&amp;#34;]
        T2[&amp;#34;ticket 表&amp;lt;br/&amp;gt;进行中的工单 → 工单服务&amp;lt;br/&amp;gt;已归档的历史工单 → 报告服务&amp;#34;]
    end
    subgraph 委派技术[&amp;#34;委派：一主一从&amp;#34;]
        T3[&amp;#34;invoice 表归计费服务所有&amp;lt;br/&amp;gt;工单服务需要时&amp;lt;br/&amp;gt;通过接口委托计费服务写&amp;#34;]
    end&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;分布式事务的三种模式&#34;&gt;分布式事务的三种模式&lt;/h3&gt;
&lt;p&gt;跨服务更新数据时，怎么保持一致？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;后台同步模式&lt;/strong&gt;：先各自写，后台进程定时对账、修复不一致。最简单，但不一致窗口最长，适合对实时性无所谓的数据（比如统计报表）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编排请求模式&lt;/strong&gt;：由一个编排者按顺序调用各服务，全部确认后才算完成。一致性好，但慢，且编排者成了耦合中心。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基于事件的模式&lt;/strong&gt;：写本地库后立刻发事件，其他服务异步消费。性能和可用性最好，但要想清楚&amp;quot;事件丢了怎么办&amp;rdquo;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;实例&lt;/strong&gt;：工单完成后要同时更新&amp;quot;工单状态&amp;quot;和&amp;quot;专家积分&amp;rdquo;。如果用编排请求，用户要等两个服务都响应；用事件模式，工单服务先发 &lt;code&gt;TicketCompleted&lt;/code&gt; 事件立即返回，积分服务异步加分——用户快了几百毫秒，代价是积分查询页面可能晚几秒才更新。Sysops Squad 选了后者：&lt;strong&gt;最终一致性换了响应速度&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-10-章-分布式数据访问&#34;&gt;第 10 章 分布式数据访问&lt;/h2&gt;
&lt;p&gt;读操作比写操作更常见：服务 A 需要服务 B 拥有的数据，怎么拿？四种模式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;服务间通信&lt;/strong&gt;：直接调 B 的接口。最简单，但每次查询都是一次网络往返，B 挂了 A 也查不了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;列模式复制&lt;/strong&gt;：把需要的那几列数据复制一份到 A 的数据库（通过消息保持同步）。查询快、无运行时依赖，但数据有延迟、要处理重复治理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复制缓存&lt;/strong&gt;：B 把数据推进共享缓存（如 Redis），A 从缓存读。适合读多写少的参考数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据域&lt;/strong&gt;：把双方都要的数据干脆划给一个专门的&amp;quot;数据域服务&amp;quot;管理。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;选择的关键问题是：&amp;quot;&lt;strong&gt;这份数据 A 需要多新鲜？B 的可用性 A 能承受吗？&lt;/strong&gt;&amp;ldquo;答案不同，模式就不同。比如专家的联系信息（几乎不变）适合复制缓存；工单的实时状态（必须最新）只能走服务间通信。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-11-章-管理分布式工作流&#34;&gt;第 11 章 管理分布式工作流&lt;/h2&gt;
&lt;p&gt;一个业务流程跨多个服务时，谁来当&amp;quot;导演&amp;rdquo;？两种风格：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    subgraph 编排[&amp;#34;编排 Orchestration：有个总指挥&amp;#34;]
        O[&amp;#34;编排者&amp;lt;br/&amp;gt;（工单流程服务）&amp;#34;]
        O --&amp;gt; A[&amp;#34;工单服务&amp;#34;]
        O --&amp;gt; B[&amp;#34;派单服务&amp;#34;]
        O --&amp;gt; C[&amp;#34;计费服务&amp;#34;]
        O --&amp;gt; D[&amp;#34;通知服务&amp;#34;]
    end&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    subgraph 编制[&amp;#34;编制 Choreography：舞者跟着音乐各自起舞&amp;#34;]
        A2[&amp;#34;工单服务&amp;#34;] --&amp;gt;|发事件| B2[&amp;#34;派单服务&amp;#34;]
        B2 --&amp;gt;|发事件| C2[&amp;#34;计费服务&amp;#34;]
        C2 --&amp;gt;|发事件| D2[&amp;#34;通知服务&amp;#34;]
    end&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;编排（Orchestration）&lt;/strong&gt;：设一个中心编排者，像乐队指挥，告诉每个服务&amp;quot;现在该你了&amp;quot;。流程一目了然、好监控、好报错；但编排者容易变成新的&amp;quot;小单体&amp;quot;，且是所有服务的耦合点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编制（Choreography）&lt;/strong&gt;：没有中心，每个服务监听事件、做完自己的事再发下一个事件，像舞者跟着音乐即兴配合。极度解耦、无单点；但流程分散在各处，&amp;ldquo;现在进行到哪一步了&amp;quot;这种简单问题都很难回答。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还有一个关键细节：**工作流状态放哪？**编排模式下状态天然在编排者手里；编制模式下要么设一个专门的&amp;quot;状态所有者&amp;quot;服务，要么忍受状态分散的痛苦。&lt;/p&gt;
&lt;p&gt;经验法则：&lt;strong&gt;流程复杂、分支多、需要人工介入补偿的，用编排；流程线性、追求吞吐量的，用编制&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-12-章-事务性-saga&#34;&gt;第 12 章 事务性 Saga&lt;/h2&gt;
&lt;p&gt;Saga 是分布式世界里替代 ACID 事务的方案：把一个跨服务的大事务拆成一串本地小事务，任何一步失败就按相反顺序执行&lt;strong&gt;补偿操作&lt;/strong&gt;（退款、释放库存……）回滚已完成的步骤。&lt;/p&gt;
&lt;p&gt;书里把第 2 章的三个维度组合起来，给 Saga 模式起了八个别致的名字（括号里的三个字母依次代表：一致性 a=原子/e=最终、通信 s=同步/a=异步、协调 o=编排/c=编制）：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;组合&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;史诗 Saga&lt;/strong&gt;（a,s,o）&lt;/td&gt;
					&lt;td&gt;原子+同步+编排&lt;/td&gt;
					&lt;td&gt;最接近传统事务，但分布式环境下最难实现&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;电话接龙 Saga&lt;/strong&gt;（a,s,c）&lt;/td&gt;
					&lt;td&gt;原子+同步+编制&lt;/td&gt;
					&lt;td&gt;既要原子性又不想有中心——又慢又脆，慎用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;童话 Saga&lt;/strong&gt;（e,s,o）&lt;/td&gt;
					&lt;td&gt;最终+同步+编排&lt;/td&gt;
					&lt;td&gt;简单好用的常见选择&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;时间旅行 Saga&lt;/strong&gt;（e,s,c）&lt;/td&gt;
					&lt;td&gt;最终+同步+编制&lt;/td&gt;
					&lt;td&gt;高并发下的妥协方案&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;奇幻小说 Saga&lt;/strong&gt;（a,a,o）&lt;/td&gt;
					&lt;td&gt;原子+异步+编排&lt;/td&gt;
					&lt;td&gt;用异步提高吞吐，靠编排守住一致性&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;恐怖故事 Saga&lt;/strong&gt;（a,a,c）&lt;/td&gt;
					&lt;td&gt;原子+异步+编制&lt;/td&gt;
					&lt;td&gt;作者直言：别这么干&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;平行 Saga&lt;/strong&gt;（e,a,o）&lt;/td&gt;
					&lt;td&gt;最终+异步+编排&lt;/td&gt;
					&lt;td&gt;最实用的组合之一&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;文集 Saga&lt;/strong&gt;（e,a,c）&lt;/td&gt;
					&lt;td&gt;最终+异步+编制&lt;/td&gt;
					&lt;td&gt;最解耦、最高可用，也最难调试&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;起这些&amp;quot;俗气&amp;quot;的名字是故意的：&lt;strong&gt;好记&lt;/strong&gt;。团队讨论时说&amp;quot;这个流程用文集模式&amp;rdquo;，比说&amp;quot;最终一致+异步通信+编制协调的 Saga&amp;quot;高效得多。&lt;/p&gt;
&lt;p&gt;核心结论：&lt;strong&gt;越往左（原子一致），越安全越慢越脆；越往右（最终一致+异步+编制），越快越抗造，但你要为&amp;quot;中间状态&amp;quot;和&amp;quot;补偿逻辑&amp;quot;付出工程成本&lt;/strong&gt;。没有免费的午餐，只有明摆着的账单。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-13-章-契约&#34;&gt;第 13 章 契约&lt;/h2&gt;
&lt;p&gt;服务之间的接口约定（Contract）该多严格？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;严格契约&lt;/strong&gt;：字段类型、格式全部写死并强校验（如带 schema 的 RPC）。好处是错误在编译/调用瞬间就暴露；代价是任何字段变更都要双方同时升级，耦合很紧。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;宽松契约&lt;/strong&gt;：只约定必需字段，其余自由扩展（如 JSON + 约定）。灵活、可独立演进；代价是错误可能潜伏到运行时才爆发。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还有两个进阶概念：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;消费者驱动的契约（Consumer-Driven Contracts）&lt;/strong&gt;：由服务的&lt;strong&gt;调用方&lt;/strong&gt;写下&amp;quot;我需要这些字段、这种格式&amp;quot;，作为测试放进提供方的流水线。提供方一改接口，立刻知道会弄坏谁——契约从&amp;quot;提供方说了算&amp;quot;变成&amp;quot;对消费者负责&amp;quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;戳记耦合（Stamp Coupling）&lt;/strong&gt;：调用时把一大坨数据结构整个传过去（比如把 50 个字段的 &lt;code&gt;Customer&lt;/code&gt; 对象传给只需要 &lt;code&gt;email&lt;/code&gt; 的服务）。对方被迫依赖整个结构的形状，改任何一个字段都可能波及无辜。&lt;strong&gt;只传对方真正需要的字段&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-14-章-管理分析型数据&#34;&gt;第 14 章 管理分析型数据&lt;/h2&gt;
&lt;p&gt;运营数据（支撑业务运转）拆给了微服务，那&lt;strong&gt;分析数据&lt;/strong&gt;（做报表、跑 BI、训练模型）怎么办？作者梳理了三代方案：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    DW[&amp;#34;数据仓库&amp;lt;br/&amp;gt;ETL 抽取 → 清洗 → 集中存储&amp;lt;br/&amp;gt;结构化、为报表优化&amp;#34;] --&amp;gt; DL[&amp;#34;数据湖&amp;lt;br/&amp;gt;原始数据先倒进去&amp;lt;br/&amp;gt;用的时候再处理&amp;lt;br/&amp;gt;灵活但容易变成数据沼泽&amp;#34;] --&amp;gt; DM[&amp;#34;数据网格&amp;lt;br/&amp;gt;按领域分布式的数据产品&amp;lt;br/&amp;gt;数据像微服务一样被治理&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;**数据网格（Data Mesh）**是本章的高潮，也是作者之一 Zhamak Dehghani 原创的概念。它的核心思想是把微服务的哲学搬到数据世界：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;领域拥有数据&lt;/strong&gt;：工单团队对自己的工单数据负责，而不是甩给中央数据团队。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据即产品&lt;/strong&gt;：数据要有明确的接口、质量承诺、文档，像 API 一样被消费。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自助式数据平台&lt;/strong&gt;：基础设施团队提供平台，领域团队自助发布数据产品。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;联邦式治理&lt;/strong&gt;：全局规则（隐私、安全）统一，领域内部自治。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作者也诚实地给出了&amp;quot;什么时候&lt;strong&gt;不要&lt;/strong&gt;用数据网格&amp;quot;：团队小、数据量不大、分析需求简单时，一个数据仓库就够了——&lt;strong&gt;架构量子越少越好，够用就行&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第-15-章-构建你自己的权衡分析&#34;&gt;第 15 章 构建你自己的权衡分析&lt;/h2&gt;
&lt;p&gt;最后一章是方法论总结：这套&amp;quot;天平分析&amp;quot;手艺怎么用到自己的项目里？&lt;/p&gt;
&lt;p&gt;几条核心建议：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;找出纠缠的维度&lt;/strong&gt;：性能和安全往往互相拉扯，先把一个决策涉及的所有维度列出来。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用 MECE 原则列清单&lt;/strong&gt;：相互独立、完全穷尽，避免漏掉某个维度的代价。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;警惕&amp;quot;脱离上下文&amp;quot;的陷阱&lt;/strong&gt;：网上说&amp;quot;Netflix 用了 X 架构所以 X 好&amp;quot;——Netflix 的上下文（规模、团队、预算）和你完全不同，结论不能直接搬。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定性分析优先于定量&lt;/strong&gt;：很多时候没法拿到精确数字，用&amp;quot;高/中/低&amp;quot;的比较级就够做决策了，别为了伪精确而瘫痪。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只给结论，别淹没听众&lt;/strong&gt;：给业务方汇报时，先说&amp;quot;推荐方案 B，因为……&amp;quot;，细节放附录。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;远离蛇油和布道&lt;/strong&gt;：任何声称&amp;quot;无条件最优&amp;quot;的方案（银弹、框架布道者），默认先怀疑。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;全书总结一张权衡分析的思维导图&#34;&gt;全书总结：一张权衡分析的思维导图&lt;/h2&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;mindmap
  root((软件架构&amp;lt;br/&amp;gt;最难的部分))
    核心理念
      没有最佳实践
      一切皆权衡
      架构量子是分析单位
    怎么拆
      组件分解六步法
      数据库五步分解
      粒度天平
        Disintegrators 往细拆
        Integrators 往粗合
    拆完怎么办
      复用四模式
      数据所有权
      分布式数据访问
    跨服务协作
      编排 vs 编制
      八种 Saga
      严格 vs 宽松契约
    数据与分析
      数据仓库/湖
      数据网格
    方法论
      适应度函数
      MECE 分析
      警惕脱离上下文&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;这本书最有价值的不是任何一条具体结论，而是它示范的&lt;strong&gt;思考方式&lt;/strong&gt;：面对任何架构决策，先问&amp;quot;这个选择让我得到什么、失去什么&amp;quot;，把天平两端的砝码摆出来，再结合自己的上下文做判断。&lt;/p&gt;
&lt;p&gt;如果你是架构新手，建议阅读顺序是：先读第 1、2 章建立&amp;quot;权衡&amp;quot;和&amp;quot;架构量子&amp;quot;的心智模型，再读第 5、6、7 章学会&amp;quot;拆&amp;quot;，最后按需查阅第 8–14 章解决&amp;quot;拆完之后&amp;quot;的具体问题。第 15 章适合放在手边，每次做重大技术选型前翻一遍——它会让你少交很多学费。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
