没有找到匹配章节
换一个关键词试试,例如“幂等”“零信任”“模块化单体”。
软件架构不是“画一张漂亮的技术图”,而是在业务目标、质量要求和现实约束下,对系统结构与演进路径作出一组影响深远、需要解释且可以验证的决策。
核心心法
从问题和质量属性出发,不从技术名词出发。“用 Kafka / Kubernetes / 微服务”不是目标;“峰值订单不丢、团队可以独立交付、故障被限制在单域、恢复时间小于 15 分钟”才是目标。
架构的三个对象
Structure
结构
系统由哪些元素组成,边界在哪里,依赖如何指向,数据由谁拥有,运行时怎样协作。
Decision
决策
为什么选择 A 而不是 B;适用条件、放弃了什么、证据是什么、何时需要重审。
Evolution
演进
如何以小步、可逆、可观测的方式改变系统,并让团队边界与技术边界共同演化。
建议的三种学习模式
MODE A · 通读
先广后深
每天 1–2 章,先形成完整地图。第一次不追求记住所有模式,而要能说清每章解决什么问题。
MODE B · 项目驱动
边做边查
选一个真实系统,用第 18 章模板产出架构文档;遇到决策时回查对应章节,并写 ADR。
MODE C · 评审训练
用问题审架构
拿现有系统逐项问:目标可量化吗?边界合理吗?失败会怎样?证据在哪里?谁负责演进?
MODE D · 面试表达
结构化讲权衡
按“背景 → 驱动 → 选项 → 决策 → 代价 → 验证 → 演进”讲述,而不是堆叠组件名称。
架构能力地图
| 层次 | 能回答的问题 | 典型产物 | 完成标准 |
| 业务与领域 | 为什么建?价值流与关键风险是什么? | 目标、利益相关者、领域地图、约束 | 技术选择能追溯到业务结果 |
| 应用与数据 | 边界怎么切?状态归谁?如何协作? | C4、上下文映射、数据流、API/事件契约 | 职责与依赖清晰,无隐性共享 |
| 技术与运行 | 怎样部署、扩展、恢复、保护和观测? | 部署视图、SLO、威胁模型、运行手册 | 关键质量属性有指标和演练 |
| 组织与演进 | 谁拥有?如何安全地改变? | ADR、团队边界、路线图、适应度函数 | 架构随证据更新而非随口号更新 |
自测:你是否已从“高级开发”转向“架构思维”?
- 能把模糊的“高性能、高可用”改写成含场景、负载、分位数与时间窗口的指标。
- 提出方案时至少给出两个可行备选,并说明收益、代价、风险与可逆性。
- 会先识别边界和数据所有权,再讨论服务数量与技术栈。
- 把部署、监控、安全、成本和故障恢复视为设计本身,而不是上线后的补充。
- 知道架构文档服务于谁、解决什么疑问,以及何时会失效。
先找出真正会改变结构的少数因素:业务目标、关键质量属性、核心领域、硬约束与最大风险。没有优先级,就没有可执行的架构。
五类架构驱动
Why业务目标
收入、转化、交付速度、法规准入、运营效率、市场窗口。要有负责人和成功指标。
Who利益相关者
用户、产品、研发、运维、安全、法务、财务、合作方;他们的“关切”往往彼此冲突。
How well质量属性
可用性、性能、安全、可修改性、成本等。必须通过场景和指标表达。
Must约束
预算、期限、团队能力、遗留系统、数据驻留、许可证、既定平台。约束不等于偏好。
Unknown风险与假设
最可能让方案失败的未知项。通过原型、压测、演练或调研尽快买到证据。
Core领域边界
核心、支撑、通用子域;关键业务不变量;谁拥有语言、规则和数据。
从模糊愿望到可用驱动
| 模糊说法 | 继续追问 | 可用于设计的表达 |
| 系统要高可用 | 哪些用户旅程?什么时间段?允许降级吗? | 结算链路月度可用性 ≥ 99.95%;推荐模块故障时结算仍可用。 |
| 要支持海量用户 | 当前、峰值、增长率?读写比?请求形态? | 大促 10 分钟内 8 万 RPS,读写 20:1,入口 p99 < 500 ms。 |
| 要快速迭代 | 谁需要独立发布?变更类型?当前瓶颈? | 四个业务域可独立交付;低风险变更从合并到生产中位数 < 2 小时。 |
| 必须上微服务 | 它解决哪个已证实的问题?成熟度足够吗? | 订单与营销发布节奏冲突,需独立扩缩容和故障隔离;团队具备服务运维能力。 |
系统边界:先画“外面”,再设计“里面”
目标与用户业务结果、关键旅程
→
系统职责做什么 / 不做什么
→
外部依赖人、系统、设备、监管
→
信任与数据边界流入、流出、所有权
高价值问题
如果外部支付、身份服务、消息平台或模型服务变慢、重复、乱序、返回错误甚至完全不可用,系统应该怎样表现?外部依赖的失败语义,常常比“正常流程”更能决定架构。
架构驱动画布
ARCHITECTURE DRIVERS CANVAS
业务目标:目标 / 指标 / 负责人 / 截止时间
关键用户旅程:主路径 / 失败影响 / 业务优先级
Top 3–5 质量属性:场景 + 数值目标 + 测量窗口
核心领域:关键规则 / 不变量 / 领域负责人
硬约束:法规 / 数据驻留 / 预算 / 期限 / 技术或组织限制
外部依赖:契约 / 限额 / SLA / 失败模式 / 替代方案
最大风险:概率 × 影响 × 可探测性
关键假设:怎样验证 / 最晚验证日期 / 证据
不在范围:明确排除,防止边界持续膨胀
风险排序:不要只看“概率 × 影响”
建议同时考虑可探测性与决策锁定成本。一个概率不高、但上线前难以发现且一旦选错就很难回退的问题,应尽早验证。例如数据库分区键、跨境数据流、第三方平台限额、模型在真实长尾问题上的质量。
风险处理只有四类:规避、降低、转移、接受。每个高风险项都要有所有者、触发条件、缓解措施和剩余风险。
质量属性不是形容词,而是可观察的系统行为。把它写成具体场景,才能连接到架构策略、测试方法、运行指标和业务后果。
质量属性场景:六个字段
刺激源谁 / 什么产生
→
刺激发生了什么
→
环境正常 / 峰值 / 故障
→
制品哪部分受影响
→
响应 + 度量行为与数值
示例 · 性能与韧性
大促期间(环境),已登录用户(刺激源)提交订单(刺激)到结算 API(制品);系统在库存服务短暂抖动时(环境补充)返回明确的“处理中”状态且不重复扣款(响应),99% 请求在 800 ms 内确认受理,最终结果在 30 秒内可查询(度量)。
十类常见质量属性
| 属性 | 先问什么 | 常见策略 | 证据 / 指标 |
| 可用性 | 哪些能力必须可用?允许怎样降级? | 冗余、健康检查、故障转移、隔离、降级 | 成功率、可用时间、错误预算 |
| 可靠性 / 韧性 | 失败后是否正确?能否恢复? | 幂等、重试、熔断、舱壁、恢复演练 | 数据差错率、MTTD、恢复时间、演练结果 |
| 性能 | 哪条旅程、什么负载、哪个分位数? | 缓存、并发、批处理、索引、异步、近数据计算 | p50/p95/p99、吞吐、饱和度 |
| 可扩展 / 弹性 | 增长维度是什么?扩容要多快? | 无状态化、分区、水平扩展、队列削峰 | 最大负载、扩容时间、单位成本 |
| 安全 / 隐私 | 保护什么、对抗谁、信任边界在哪? | 最小权限、分层防御、加密、审计、数据最小化 | 控制覆盖、漏洞时效、越权测试、审计完整性 |
| 可修改 / 可维护 | 哪类变化最常见?影响范围多大? | 模块化、信息隐藏、稳定接口、自动化重构 | 变更前置时间、变更扩散、认知复杂度 |
| 可测试 / 可部署 | 能否独立验证和发布? | 依赖替身、契约测试、特性开关、向后兼容 | 反馈时长、发布频率、失败与返工率 |
| 可操作 / 可观测 | 如何知道“对用户而言”是否健康? | 结构化遥测、关联 ID、运行手册、自动化处置 | 检测时间、告警有效率、诊断时长 |
| 互操作 / 可移植 | 要跨什么边界?迁移的真实概率? | 开放契约、适配层、数据导出、可替换边界 | 兼容矩阵、迁移演练、替换成本 |
| 成本 / 可持续 | 按什么单位创造价值?峰谷如何? | 预算、自动伸缩、存储分层、关停闲置、碳感知调度 | 每用户/交易成本、利用率、能耗代理指标 |
权衡不是缺陷,而是架构的本体
一致性 ↔ 可用性/延迟同步确认还是最终一致
强一致减少业务歧义,却可能增加跨区延迟与故障耦合;最终一致提高解耦,需要补偿、可见的中间状态和业务容忍。
安全 ↔ 易用性/速度控制强度与摩擦
更严格的身份、审批和隔离会增加操作成本。用风险分层、自动化和短时凭据降低摩擦。
解耦 ↔ 复杂度独立性不是免费的
服务化与异步能隔离变化,却引入网络、契约、数据一致性、观测和运维成本。
性能 ↔ 成本/新鲜度缓存与预计算
更低延迟往往意味着更多副本、缓存或冗余计算;需要明确定义失效、陈旧窗口和单位经济性。
优先级:只保留真正决定结构的 Top 3–5
可使用 业务价值 × 风险暴露 × 区分度 排序。所有系统都希望“安全、稳定、快速”,但只有那些会导致不同结构决策的属性才是架构驱动。例如“结算绝不重复扣款”比泛化的“可靠”更有区分度。
QUALITY SCENARIO
属性名称:
刺激源:
刺激:
环境(正常 / 峰值 / 部分故障 / 攻击):
受影响的系统或组件:
期望响应:
度量(分位数 / 比例 / 时间窗口 / 数据量):
业务后果:
验证方式(测试、演练、监控、审计):
负责人及复审日期:
反模式:把质量属性写成“越高越好”
“无限扩展”“零停机”“绝对安全”会把成本推向无穷,并让团队无法判断何时足够。每个质量目标都应包含范围、阈值、时间窗口与预算。对于不关键的路径,明确较低目标或允许降级,反而能提升整体可靠性。
架构不是瀑布阶段。它是一条反复循环的证据链:理解问题、提出假设、比较选项、记录决策、实现验证、观察结果,再修正模型。
十步轻量架构循环
定义结果与范围
业务指标、用户旅程、系统职责、不在范围;确认谁有决策权。
识别利益相关者与关切
产品、工程、运行、安全、数据、财务与合规需要看到不同视图。
提炼架构驱动
Top 质量场景、硬约束、关键领域、不变量、外部依赖。
建立系统上下文
边界、交互、数据与信任流;先确定外部契约,再拆内部结构。
生成至少两个可行选项
包括“保持简单 / 暂不拆分”。避免把工具偏好包装成唯一方案。
按场景分析权衡
比较质量收益、复杂度、成本、团队适配、锁定和可逆性。
先验证最高风险假设
原型、性能模型、威胁建模、故障演练、供应商限额测试。
记录决策与未决问题
用 ADR 保存背景、选项、决定、后果和重审触发器。
实现、测试并发布小切片
用架构适应度函数、契约测试、SLO 和成本指标验证。
运行反馈与演进
复盘真实行为,更新图、风险、ADR 状态与下一轮假设。
决策记录(ADR)的最小结构
Context背景
当前问题、约束、驱动、证据和为什么现在必须决定。
Options选项
至少两个真实可行方案,以及“不改变”的基线。
Decision决定
选择、理由、适用范围、负责人和日期。
Consequences后果
得到什么、牺牲什么、风险、行动与重审条件。
可逆性决定决策速度
双向门(容易回退)应快速试验,例如内部库或可替换 UI;单向门(高锁定、高迁移成本)需要更多证据,例如核心数据模型、跨域协议、租户隔离策略和全局身份体系。不要让所有决策都走同样重的流程。
选项比较:定量辅助,定性负责
| 维度 | 建议问题 | 证据 |
| 业务适配 | 是否直接支持关键旅程与市场节奏? | 价值流、业务指标、情景演练 |
| 质量属性 | 在具体场景下改善了什么、损害了什么? | 压测、故障演练、威胁模型、容量模型 |
| 复杂度 | 新增多少运行时组件、契约和失败模式? | 依赖图、认知负荷、运维任务清单 |
| 组织适配 | 团队能独立拥有、交付并值守吗? | 技能矩阵、所有权、值班能力 |
| 经济性 | 总拥有成本与单位业务成本是多少? | 三年成本模型、容量与许可估算 |
| 可逆与锁定 | 退出路径是什么?数据能否导出? | 迁移原型、开放格式、替代供应商验证 |
加权评分表适合让隐含偏好显性化,但分数不是“科学真相”。权重、证据置信度和否决项应与总分一起呈现。
风险驱动评审
大型系统可借鉴 ATAM 的思想:由不同利益相关者建立质量属性效用树,用具体场景评估方案,识别敏感点(某参数变化显著影响质量)、权衡点(同时影响多个属性)和风险主题。轻量团队可用 90 分钟工作坊完成简化版:
- 10 分钟:目标、范围和架构概览。
- 20 分钟:独立提出失败场景与变化场景。
- 15 分钟:按业务影响和发生可能排序。
- 30 分钟:逐个追踪到结构、策略、监控和证据。
- 15 分钟:确认风险所有者、验证动作与截止时间。
何时不该立即做架构决策?
- 信息价值高且获取成本低:先做探针、原型或流量回放。
- 决定可延迟且不会阻塞交付:记录为待决问题与最晚决策时间。
- 需求本身仍在探索:优先保护可逆性、模块边界与数据导出能力。
- 团队还没有观察到真实瓶颈:先测量,避免为想象中的规模付费。
ISO/IEC/IEEE 42010:2022 区分“架构”与表达它的“架构描述”,并以利益相关者、关切、视点、视图和模型组织描述。它规定应表达什么关系,但不强制某种格式或工具。[1]
先选读者和问题,再选图
| 读者 / 关切 | 最有用的视图 | 必须回答 |
| 业务与产品 | 系统上下文、能力/领域图、关键旅程 | 价值、范围、外部依赖、业务风险 |
| 开发团队 | 容器、组件、领域模型、接口与决策 | 边界、职责、依赖、数据所有权、约束 |
| 运维 / SRE | 部署、运行时、故障域、遥测与恢复 | 怎样运行、怎样失败、怎样诊断和恢复 |
| 安全 / 合规 | 数据流、信任边界、身份、控制与审计 | 资产在哪里、谁能访问、如何证明 |
| 管理与财务 | 路线图、成本模型、风险与依赖 | 投入、锁定、里程碑、剩余风险 |
C4:按抽象层级缩放
C4 Static Structure · 从世界到代码
1 · Context系统、用户与外部系统;业务范围
2 · Container可运行应用与数据存储;技术和通信
3 · Component单个容器内部的主要职责单元
4 · Code类、接口、函数;只在确有价值时画
C4 还包含系统景观、动态和部署图。官方建议并非每次都画四层;对多数团队,上下文图与容器图已经能提供大部分价值。[2]
arc42:一份可裁剪的架构文档骨架
01–03目标与边界
引言与目标、约束、上下文与范围。
04–07核心结构
解决方案策略、构建块、运行时、部署。
08–10横切与决策
横切概念、架构决策、质量要求。
arc42 的 12 个部分是问题清单,不是要求全部写满的官样模板;按系统风险和读者需求裁剪。其官网在 2026 年提供 Version 9 及中文模板。[3]
最小可行架构文档(MVAD)
一页摘要
业务目标、范围、Top 质量目标、关键约束、负责人、文档状态。
上下文 + 容器
外部角色和系统、内部可运行单元、数据存储、协议、所有权。
关键运行时场景
主路径、失败路径、异步处理、数据一致性和恢复流程。
部署与运行
环境、区域/可用区、网络边界、扩缩容、遥测、备份和灾备。
ADR、风险和术语
重要决策可追溯;已知债务不隐藏;同一个词只有一个明确含义。
一张架构图的合格线
| 检查项 | 合格标准 |
| 标题与范围 | 说明图的类型、系统、版本/环境与读者。 |
| 抽象层级 | 一张图只讲一个层级;不把“支付系统”和某个 Java 类并列。 |
| 元素 | 每个元素有名称、类型、职责;必要时标明技术与所有者。 |
| 关系 | 每条箭头有方向和意图;必要时标明协议、同步/异步、数据。 |
| 边界 | 系统、部署、网络、信任、团队或事务边界的含义明确。 |
| 图例 | 颜色、形状、线型、缩写均可解释;黑白打印仍能理解。 |
| 时间与状态 | 负责人、最后更新日期、适用版本、草案/已批准/已废弃状态。 |
保持文档“活着”
把稳定的意图与边界写入文档,把易变化的事实尽量从代码、部署清单、API 规范和遥测自动生成;在变更评审中更新 ADR 与图。文档越接近代码和交付流程,越容易与现实同步。
4+1、C4、arc42、UML、ArchiMate 应如何选择?
- C4:软件系统结构沟通的轻量共同语言,开发团队最容易采用。
- arc42:完整架构文档的内容目录,可在内部使用 C4、UML 或文字。
- 4+1:从逻辑、开发、进程、物理及场景组织视图,适合建立“多视图”意识。
- UML:需要精确表达序列、状态、类或组件语义时使用,不必全套采用。
- ArchiMate / TOGAF:跨业务、应用、数据和技术的企业级组合治理更合适。
它们不是互斥产品。常见组合是:arc42 作为目录,C4 表达软件结构,UML 序列图表达关键运行时场景,ADR 保存决策。
高内聚、低耦合不是口号。一个好边界应围绕同一业务能力共同变化,隐藏内部细节,拥有清晰契约,并允许团队在不理解整个系统的前提下安全工作。
十条可操作的架构原则
| 原则 | 设计含义 | 检查问题 |
| 关注点分离 | 把变化原因不同的职责分开。 | 业务规则是否被 UI、数据库或供应商 SDK 污染? |
| 信息隐藏 | 边界暴露稳定能力,隐藏易变实现。 | 调用方是否依赖内部表、字段或执行顺序? |
| 高内聚 | 共同完成业务不变量的代码与数据放在一起。 | 一次业务变更是否总在同一模块完成? |
| 低耦合 | 减少同步、语义、数据、部署与组织依赖。 | 一个变化会迫使多少模块、服务和团队协调? |
| 依赖倒置 | 稳定业务策略不依赖易变技术细节。 | 替换消息、存储或第三方服务是否触碰核心规则? |
| 显式优于隐式 | 契约、所有权、失败语义和副作用可见。 | 是否存在靠约定、共享库魔法或数据库触发器隐藏的行为? |
| 状态单一权威 | 每项关键事实只有一个可判定的主记录。 | 冲突时谁是 System of Record?如何传播与对账? |
| 故障隔离 | 限制资源、依赖和错误的爆炸半径。 | 非关键能力失败是否拖垮核心旅程? |
| 最小机制 | 只引入被已知驱动证明必要的复杂度。 | 删掉这一层、服务或中间件会具体损失什么? |
| 为变化留证据 | 可观测、可测试、可迁移,而非抽象一切。 | 怎样知道边界仍有效?退出路径是否演练过? |
耦合不止是“是否调用”
Temporal时间耦合
双方是否必须同时在线?同步链越长,联合可用性越低。
Semantic语义耦合
对字段含义、业务规则或事件顺序的共同假设有多少?
Data数据耦合
是否共享表、跨边界联表、共同修改同一事实?
Deployment部署耦合
一个变化是否要求多个单元同时发布或回滚?
Operational运行耦合
是否共享容量、故障域、证书、队列或限额?
Organizational组织耦合
完成一次变更需要跨多少团队排期、审批和协调?
DDD:让业务语言成为边界工具
业务能力与价值流用户为什么付费
→
子域分类核心 / 支撑 / 通用
→
限界上下文模型与语言边界
→
上下文映射关系与集成策略
→
团队与数据所有权端到端负责
战略 DDD决定“哪里应该不同”:子域、限界上下文、通用语言、上下文关系;战术 DDD帮助“内部如何表达”:实体、值对象、聚合、领域服务、仓储和领域事件。不要在没有战略边界时机械堆叠战术模式。
| 概念 | 正确理解 | 常见误区 |
| 限界上下文 | 一套模型与语言在其中一致的语义边界。 | 等同于微服务、数据库或组织部门。 |
| 聚合 | 在一次事务中维护业务不变量的一致性边界。 | 把整张对象图一次加载并强一致更新。 |
| 领域事件 | 领域中已经发生、对其他能力有意义的事实。 | 把内部 CRUD 细节全部广播成事件。 |
| 防腐层 | 翻译外部模型,保护本域语言与规则。 | 只做字段映射,不隔离语义差异。 |
| 上下文映射 | 描述上下文间权力、依赖和翻译关系。 | 只画调用箭头,不讨论所有权和演进策略。 |
六边形、洋葱与 Clean Architecture
三者名称与分层细节不同,但共享一个目标:业务规则位于内侧,外部世界通过端口/接口接入,源代码依赖指向更稳定的内层。它们是单个部署单元内部的组织方式,不自动等于微服务。
Inside领域与应用用例
业务不变量、流程编排、端口定义。可以在不启动数据库、Web 框架和消息系统时进行快速测试。
Boundary端口与契约
输入端口表达系统可做什么;输出端口表达核心需要什么。契约属于稳定一侧。
Outside适配器与基础设施
HTTP、CLI、数据库、消息、供应商 API。实现端口并处理技术细节。
Rule依赖方向
外层依赖内层,内层不知道具体框架。运行时控制流可以双向,源码依赖仍向内。
边界测试
如果某个模块能用一句领域语言说明职责,拥有自己的规则与状态,公开很少且稳定的契约,依赖方向明确,并能被单独测试,那么它具备成为好边界的条件。是否把它部署成服务,是下一层决策。
康威定律与“逆康威机动”
系统的通信结构往往映射组织的沟通结构。想获得清晰、可独立演进的边界,需要让团队对相应业务能力端到端负责,并减少长期跨团队排队。反过来,不能只画目标架构而保持与之冲突的所有权结构;技术边界、认知负荷、值班职责和产品边界要一起设计。
先选能满足驱动因素的最简单结构,再让真实的团队协作、扩缩容和故障数据推动拆分。多数系统会组合多种风格,但每种风格都要有明确适用范围。
常见风格与真实代价
| 风格 | 适合 | 主要收益 | 主要代价 / 风险 |
| 分层 / N-tier | 传统业务系统、职责稳定、低频变更 | 易理解、关注点分离、迁移友好 | 横向分层导致一项业务变更多层扩散;容易形成贫血领域模型 |
| 模块化单体 | 新产品、中小团队、领域仍在探索 | 事务与调试简单、部署低成本、可保持清晰边界 | 需强制模块规则;单一部署和资源隔离能力有限 |
| 六边形 / Clean | 业务规则长寿、外部技术易变 | 核心可测试、依赖可替换、技术污染少 | 端口过度设计、简单 CRUD 被复杂化 |
| 微服务 | 复杂领域、多自治团队、独立发布与扩缩容有高价值 | 独立交付、故障和技术隔离、按域扩展 | 网络、数据一致性、契约、平台、观测和组织成本高 |
| SOA | 企业级能力复用、异构遗留集成 | 服务契约、业务能力复用、跨系统编排 | 中心化治理或 ESB 可能成为瓶颈;边界过粗 |
| 事件驱动 | 多消费者、实时反应、高吞吐、时间解耦 | 扩展性、解耦、缓冲、审计/重放潜力 | 顺序、重复、最终一致、调试与模式演进复杂 |
| CQRS | 读写模型差异显著、复杂写规则、读侧多样 | 分别优化读写、清晰命令语义、读模型弹性 | 同步与一致性成本;对普通 CRUD 收益很低 |
| 事件溯源 | 完整历史是业务资产、需要时态查询或可重建状态 | 不可变历史、审计、重放和新投影 | 事件不可轻改、删除/隐私困难、投影与版本治理重 |
| Serverless / FaaS | 突发或间歇负载、事件处理、快速实验 | 按用量、自动弹性、少管基础设施 | 冷启动、限额、状态与本地调试、供应商约束 |
| Pipe & Filter | 编译、ETL、媒体处理、AI 数据管道 | 阶段可组合、并行、独立测试与替换 | 中间格式、错误恢复、端到端延迟与背压 |
| 微前端 | 大型前端、多自治团队需独立交付 | 前端所有权与发布解耦 | 体验不一致、重复依赖、运行时集成与性能成本 |
微软的架构风格指南同样强调:风格通过约束产生性质,每种风格都有权衡;选择应从业务驱动和质量属性开始,而不是追求“纯度”。[4]
同一原则在不同场景中的特化
| 场景 | 最重要的额外驱动 | 典型架构关注 |
| 多租户 SaaS | 隔离等级、噪声邻居、租户生命周期、计量计费 | 控制面/数据面、分层隔离、配额、租户级 SLO 与迁移 |
| 移动 / 离线优先 | 断网、电量、设备存储、版本碎片、隐私 | 本地优先状态、增量同步、冲突合并、Schema 迁移、后台限制 |
| IoT / 边缘 | 间歇连接、海量设备、物理安全、远程升级 | 设备身份、边缘缓冲、遥测背压、命令确认、签名 OTA 与回滚 |
| 流处理 / 实时分析 | 事件时间、迟到、顺序、吞吐与端到端延迟 | 分区、水位、窗口、检查点、重放、状态存储和 Exactly-once 边界 |
| HPC / 批计算 | 吞吐、数据局部性、作业排队、昂贵计算 | 并行分解、检查点/恢复、调度、制品与结果可重现 |
| 嵌入式 / 安全关键 | 确定性期限、资源上限、危害与认证证据 | 故障安全、冗余、静态分析、硬实时、端到端追溯与独立验证 |
| 大型前端 | 体验一致、状态复杂度、包体、团队独立发布 | 设计系统、状态边界、BFF、性能预算;微前端只在自治收益明确时使用 |
微服务是否值得:四个前置条件
Domain边界可识别
限界上下文和数据所有权有业务依据,不是按技术层拆服务。
Team团队可自治
能对构建、发布、运行、值班和成本端到端负责。
Platform平台已就绪
自动交付、身份、遥测、配置、故障处理和开发者自助。
Benefit独立性有价值
发布、扩缩容、合规或故障隔离的收益能覆盖分布式成本。
实用默认值 · 本手册的建议
对于领域尚在发现、团队不多、运维能力一般的新系统,优先考虑模块化单体 + 清晰领域边界 + 异步工作队列。它不是“以后一定拆”的临时品,而是可长期成立的结构;只有当独立交付、故障隔离或差异化扩展被数据证明时再提取服务。
启发式风格顾问
这是用于学习的启发式提示,不替代质量场景、成本模型和架构评审。
拆分服务的顺序
- 先在代码内建立模块、依赖规则和数据所有权。
- 用遥测识别真实的变更冲突、热点、故障耦合或合规边界。
- 为候选边界建立明确 API/事件契约和独立测试。
- 使用绞杀者模式逐条迁移能力,保留回退路径。
- 最后才独立部署与存储,并补齐 SLO、值班、成本与安全所有权。
常见反模式
- 分布式单体:服务很多,但共享数据库、必须一起发布、同步调用成链。
- 纳米服务:边界按实体或 CRUD 切分,业务事务跨大量网络调用。
- 事件化一切:为了“解耦”隐藏业务流程,没有所有者、契约和对账。
- 微前端复制后端问题:技术栈各异、用户体验破碎、公共能力无治理。
- Serverless 幻觉:“无服务器”不等于无运行责任;限额、权限、成本和观测仍需设计。
分布式设计的目标不是假装网络可靠,而是让不确定性有边界:每个远程调用有时间预算,每个重复操作安全,每个异步流程可追踪、可对账、可补偿。
八个必须默认成立的事实
- 网络会失败
- 延迟不为零且会抖动
- 存在部分失败
- 时钟并不完全同步
- 消息可能重复或乱序
- 容量与队列有限
- 拓扑与版本会变化
- 遥测也可能缺失或延迟
远程调用的韧性工具箱
| 模式 | 解决什么 | 关键约束 / 常见坑 |
| 超时 | 限制等待和资源占用 | 从端到端预算向下分配;连接与读取分开;不能无限默认值 |
| 重试 + 退避 + 抖动 | 处理短暂故障 | 仅对可重试且幂等操作;尊重总预算;防止重试风暴 |
| 熔断 | 失败依赖下快速失败并探测恢复 | 不是万能开关;阈值、半开探测和观测需按依赖调优 |
| 舱壁 | 隔离线程、连接、队列或租户资源 | 池过多浪费资源,过少无法隔离;明确爆炸半径 |
| 限流 / 配额 | 保护容量与公平性 | 入口、租户、用户和下游分别控制;返回可重试信息 |
| 背压 / 负载卸除 | 过载时保持核心能力 | 队列必须有界;按优先级拒绝、降级或延迟非关键工作 |
| 幂等 / 去重 | 让重复请求不产生重复业务效果 | 幂等键有作用域、保留期和原子写;响应也应可重放 |
| 降级 / 回退 | 依赖失败时保留核心旅程 | 回退数据的新鲜度和安全边界要明确;避免静默错误 |
| 死信 / 隔离队列 | 隔离无法处理的消息 | 不是墓地;必须有告警、诊断、修复、重放和保留策略 |
端到端时间预算 · 示例
入口预算 800 ms含排队与序列化
→
订单 500 ms最多 1 次短重试
→
库存 220 ms超时即转处理中
→
异步确认30 s 最终状态 SLO
CAP 与 PACELC:讨论业务语义,而不是背字母
CAP关注发生网络分区时,系统无法同时保证线性一致与每个请求都成功响应;必须按操作选择倾向。PACELC进一步提醒:即使没有分区,也常在延迟(L)与一致性(C)间权衡。真正要问的是:
- 哪个业务不变量必须同步守住?例如“同一座位只能售出一次”。
- 哪些读允许陈旧,陈旧多久,用户能否看见“处理中”?
- 冲突如何检测、谁有权合并、能否补偿、是否需要人工介入?
- 分区期间是拒绝、排队、只读、有限降级,还是接受暂时分歧?
跨服务事务的选择
| 方法 | 适用 | 代价与注意 |
| 本地 ACID | 同一数据所有者内的不变量 | 首选;不要为了形式上的服务独立把一个聚合事务拆散 |
| 两阶段提交 | 少数受控环境、参与者支持、强原子性价值极高 | 协调器、锁与可用性成本;跨组织和大规模系统通常不合适 |
| Saga · 编排 | 流程清晰、需要中心状态和可视化 | 编排器可能变成业务耦合中心;补偿不是“数据库回滚” |
| Saga · 协同 | 上下文自治、事件自然驱动后续动作 | 全局流程难看见;避免事件环和无人拥有的流程 |
| Transactional Outbox + CDC | 原子写业务状态与待发布事件 | 仍会重复,消费者必须幂等;监控发布延迟与积压 |
| 对账 / 修复 | 外部系统和长流程不可避免的不一致 | 定义权威记录、差异阈值、修复权限和审计;不是事后补丁 |
消息语义:Exactly-once 是端到端性质
At-most-once最多一次
可能丢,但不会由传输重发。适合可丢遥测或可重新获取的数据。
At-least-once至少一次
不轻易丢,但可能重复。配合幂等消费者、去重与可重放设计最常见。
Effectively once业务上一次
传输、处理、状态写入、幂等键与外部副作用共同保证可观察效果仅一次。
全局有序代价高且通常不必要。优先定义按聚合/实体键有序;事件含业务键、版本或序列号,消费者检测缺口、陈旧与重复。用事件时间处理迟到数据,用水位线或窗口明确完整性。
缓存是一个数据系统
| 模式 | 适用 | 必须设计 |
| Cache-aside | 通用读缓存 | TTL、穿透、击穿、雪崩、陈旧容忍和失效 |
| Read-through / Write-through | 希望缓存层统一数据访问 | 写延迟、故障语义、源数据一致性 |
| Write-behind | 高写吞吐且允许延迟持久化 | 丢失窗口、顺序、重放、持久队列 |
| CDN / Edge | 静态或可缓存公开内容 | Cache-Control、主动失效、个性化和隐私泄漏 |
分布式设计评审的一句话
对每条跨边界交互逐项写清:超时、重试、幂等、顺序、一致性、容量、授权、可观测、降级、补偿、对账。任何空白都会在生产环境里变成隐式默认值。
把操作主记录与派生副本分开:前者守住业务不变量,后者服务搜索、分析、推荐或 AI。每个副本同样需要所有者、血缘、新鲜度、删除传播与恢复策略。
数据生命周期控制面
采集 / 接入用途、同意、契约
→
验证 / 分类质量、敏感级别
→
处理 / 存储血缘、加密、分区
→
服务 / 共享授权、SLO、审计
→
归档 / 删除保留、传播、证明
按访问模式选择存储
| 类型 | 优势场景 | 关键问题 |
| 关系型 | 事务、约束、灵活查询、核心业务记录 | 索引与锁、垂直/水平扩展、分区键、迁移 |
| 文档 | 聚合式数据、模式变化、按文档读写 | 跨文档事务、冗余、一致性、文档增长 |
| 键值 / 缓存 | 低延迟查找、会话、计数、热点数据 | 内存成本、持久性、淘汰、热键 |
| 宽列 | 大规模稀疏数据、按主键与列族访问 | 查询需预设计、分区热点、最终一致 |
| 图 | 多跳关系、欺诈、知识图谱、网络分析 | 遍历边界、模型治理、分布式图成本 |
| 搜索引擎 | 全文、倒排、聚合与相关性 | 通常是派生索引;同步、重建、删除传播 |
| 时序 | 指标、传感器、按时间窗口聚合 | 基数、降采样、保留、迟到数据 |
| 对象存储 | 低成本大对象、数据湖、备份与制品 | 元数据、小文件、生命周期、不可变与版本 |
| 仓库 / 湖仓 | 跨域分析、历史、批流统一、BI/ML | 数据契约、质量、血缘、计算成本与治理 |
| 向量索引 | 语义检索、相似度、RAG 召回 | ACL、租户隔离、新鲜度、评估、重嵌入与删除 |
先写访问模式、数据量、增长、读写比、一致性、延迟、保留、合规和恢复目标,再选产品。“多模型数据库”也不会消除数据建模。
OLTP 与 OLAP:一份事实,两类优化目标
OperationalOLTP · 运行当前业务
小而频繁的读写、强约束、低延迟、当前状态。围绕业务事务和聚合设计。
AnalyticalOLAP · 理解历史与整体
大范围扫描、聚合、历史快照、跨域分析。围绕维度、事实、列式存储与计算设计。
MovementCDC / 事件 / 批处理
选择更新时效、顺序、重放、删除与模式兼容策略;不能依赖无审计的手工导出。
Reconcile对账与可重建
源记录、偏移、水位、校验和与补数流程让派生系统可验证,而非“看起来差不多”。
数据产品卡片
DATA PRODUCT / DATASET CARD
名称与业务用途:
Owner / Steward / Producer / Consumer:
System of Record 与来源:
数据分类、合法依据、驻留与租户:
Schema / Data Contract / 版本与兼容策略:
血缘与 Provenance:
质量 SLO(准确、完整、一致、有效、及时、唯一、可追溯):
访问控制、脱敏、加密与审计:
新鲜度、保留、归档、删除及下游传播:
RPO / RTO、备份恢复、重处理与对账:
成本归属、消费者清单、废弃流程:
Data Mesh:组织模型,不是买一套平台
Ownership领域所有权
最理解数据的领域团队对生产与共享质量端到端负责。
Product数据即产品
可发现、可理解、可信、可访问、可互操作,并有 SLO。
Platform自助数据平台
把接入、质量、血缘、安全和运行能力产品化,降低认知负荷。
Governance联合计算治理
全局规则与领域自主结合,策略尽可能自动执行。
当组织规模、领域自治和跨域数据需求不足时,Data Mesh 的协调成本可能大于收益。小团队先建立明确所有权、契约、目录与质量指标,通常比组织重构更有效。
多租户数据隔离
| 模型 | 优点 | 代价 / 适用 |
| 共享库共享表 + Tenant ID | 成本低、运营简单 | 必须在每层强制租户过滤;爆炸半径大,适合低隔离等级 |
| 共享库独立 Schema | 隔离与成本折中 | 迁移、连接池与 schema 数量治理复杂 |
| 每租户独立数据库 | 隔离、备份、迁移和定制更强 | 运营对象多;适合高价值或合规租户 |
| 分层混合 | 按租户等级分配隔离 | 需要明确放置策略、迁移路径和统一控制面 |
恢复能力的真相
“已开启备份”不等于可恢复。要定期在隔离环境完成还原,验证加密密钥、依赖配置、日志重放、数据一致性、恢复时长和业务验收,并记录证据。
协议选择只是表层;真正决定长期成本的是语义、所有权、兼容性、失败行为、身份边界和变更流程。契约必须同时描述正常返回与失败、限额、幂等和废弃。
交互风格对比
| 方式 | 最适合 | 优势 | 主要风险 |
| REST / HTTP | 资源型公开 API、通用集成 | 生态成熟、可缓存、可观察、易穿越边界 | 语义不严谨、过多往返、版本与错误模型不一致 |
| gRPC / RPC | 内部低延迟、强类型、流式通信 | 高效、代码生成、明确契约 | 时间耦合、浏览器/公网兼容、调用链膨胀 |
| GraphQL | 多样客户端、聚合图、字段选择 | 避免过取/少取,单一类型图 | N+1、复杂度/成本滥用、授权到字段级、缓存困难 |
| 事件 / Pub-Sub | 多消费者、异步反应、状态传播 | 时间解耦、扩展、缓冲与重放 | 最终一致、重复、顺序、发现和调试困难 |
| Webhook | 跨组织轻量事件通知 | 实现简单、接收方无需轮询 | 签名、重试、去重、出站 SSRF 与投递可见性 |
| 批文件 / 对象 | 大体量、低频、遗留或监管交换 | 吞吐高、边界清楚、可审计 | 时效、部分失败、文件契约与重跑 |
契约设计的最低要求
Semantics业务语义
命令还是查询、资源还是动作;不变量、授权主体、幂等范围。
Failure失败语义
错误分类、可否重试、超时、限额、部分成功、处理中状态。
Evolution演进规则
兼容变更、版本、废弃期、消费者清单和迁移证据。
Security信任与数据
身份、对象/字段级授权、数据分类、输入输出校验和审计。
Operations运行约定
SLO、容量、配额、关联 ID、所有者、支持和事件响应。
Specification机器可读
OpenAPI、AsyncAPI、Protobuf/IDL、JSON Schema 与契约测试。
兼容性规则
Request输入要保守演进
新增可选字段通常兼容;重命名、改变含义、缩小允许范围通常破坏消费者。服务端拒绝未知字段还是忽略,要明确。
Response消费者要宽容但不失控
新增响应字段通常兼容;删除、类型变化、枚举新增对某些生成客户端仍可能破坏,需契约测试。
Event事件是长期公共事实
事件一旦发布很难收回。Schema ID、业务版本、时间、来源、键与追踪字段应标准化。
Retirement废弃是一个产品流程
发现消费者、公告、双写/适配、使用遥测、截止日期和最终阻断;不能只把文档标成 deprecated。
命令、事件与通知
| 类型 | 语言 | 所有权与期望 |
| 命令 | “请做某事”——动词、可拒绝 | 发送者知道目标能力;接收者决定是否执行并返回结果 |
| 领域事件 | “某事已发生”——过去式、不可撤回 | 发布者拥有事实;不知道或不控制消费者 |
| 事件通知 | 只含事实 ID 与最少信息 | 消费者需回查源系统,耦合到其可用性但减少复制 |
| 携带状态事件 | 包含消费者所需快照 | 消费自治更强,但隐私、大小、演进和删除传播成本更高 |
EVENT ENVELOPE · 概念模板
event_id: 全局唯一,用于去重
event_type: 领域事实名称
schema_version: 契约版本
occurred_at / recorded_at: 事件时间与记录时间
source: 发布上下文与所有者
subject_id / partition_key: 业务主体与局部顺序键
correlation_id / causation_id / trace_id: 流程、因果与追踪
tenant / classification: 租户与数据分类(不放不必要敏感数据)
payload: 业务事实;只承诺契约内字段
注意:代理生成的文本、用户输入和外部数据永远不应成为可信指令。
API Gateway 与 BFF 的边界
网关适合终止 TLS、身份验证、路由、配额、协议转换和统一遥测;BFF适合为特定客户端聚合与裁剪体验。两者都不应吞下领域规则、跨域事务和所有业务编排,否则会形成“聪明管道、贫血服务”的新中心。
第三方 API 也不可信
验证响应 schema 与业务范围,设置出站允许清单、TLS、超时、熔断、速率和成本上限;敏感操作要幂等、可对账。OWASP API Security Top 10 2023 特别强调对象/属性/功能级授权、资源消耗、敏感业务流、SSRF、资产清单和不安全消费第三方 API。[5]
从托管服务、自动化和声明式基础设施获得弹性与反馈,再按业务价值决定需要多少控制。平台应成为内部产品,为团队提供安全默认值和自助“黄金路径”,而不是新的工单中心。
2026 生态提示
CNCF 当前《云原生定义》为 v1.1,强调系统应可编程、可重复部署、松耦合、安全、有韧性、可管理、可持续且可观测;容器和微服务只是常见手段。Kubernetes v1.36 于 2026-04 发布。ingress-nginx 已在 2026-03 退休,新项目应评估 Gateway API 或其他持续维护的实现,并始终核对供应商支持周期。[26][27][28]
三大云架构框架的共同视角
| 框架 | 核心支柱(截至资料核对日) | 阅读方式 |
| AWS Well-Architected | 运营卓越、安全、可靠性、性能效率、成本优化、可持续性 | 用问题驱动定期评审,不把评审当审计[6] |
| Azure Well-Architected | 可靠性、安全、成本优化、运营卓越、性能效率 | 围绕工作负载权衡,持续优化而非一次达标[7] |
| Google Cloud Well-Architected | 运营卓越、安全/隐私/合规、可靠性、成本、性能、可持续性;另有 AI/ML 等跨支柱视角 | 强调为变化设计、文档、简化、解耦与无状态[8] |
三者名称略有差异,但都要求把安全、可靠、性能、运营和成本一起权衡。可持续性不只是环境议题:减少空闲、过度配置和无价值数据,也通常同时降低成本与复杂度。
Kubernetes:何时是平台,何时是负担
Good fit适合
许多容器化工作负载、需要一致调度/网络/策略、自托管或混合环境、团队有平台能力,且控制价值高。
Poor fit不一定适合
少量简单应用、无平台团队、数据库和消息均可托管、业务更看重速度而非底层可控。
Provides它提供
声明式配置、调度、服务发现、滚动发布、自愈与扩缩容的基础抽象。[9]
Does not provide它不自动提供
正确的服务边界、业务韧性、数据一致性、安全架构、低成本和良好开发体验。
平台工程:平台即产品
Discover从用户需求开始
产品团队的高频、无差异化痛点决定路线图;不从工具清单开始。
Self-service自助与可组合
通过门户、API、CLI、模板和文档按需获得能力,减少人工等待。
Golden path安全默认路径
项目模板内建构建、测试、身份、遥测、成本标签与策略。
Measure用结果衡量
首次生产时间、交付表现、任务成功率、采用/留存和开发者满意度。
CNCF 将内部平台定义为按用户需要整合与呈现能力的横切层,并强调“平台即产品”、一致体验、自助、降低认知负荷、可选可组合及默认安全;“最薄可行平台”往往优于自建所有底层能力。[10]
云基础与交付控制面
Landing Zone账号、网络、身份、日志
→
IaC + Policy as Code可审查、可重建、护栏
→
交付 / GitOps声明、审批、漂移与回滚
→
运行平台计算、数据、消息、身份
→
遥测与 FinOpsSLO、成本、容量、碳
- 基础设施即代码:版本化、评审、自动计划与应用;检测漂移,秘密不进入代码库。
- 策略即代码:阻止公开存储、未加密、无所有者/成本标签、超权限与不可信制品等违规。
- GitOps:声明的期望状态与自动协调有助于审计和回退,但紧急流程、秘密、数据库变更仍需专门设计。
- 可观测默认:新服务无需工单即可获得统一指标、追踪、日志、告警模板和成本归属。
单区、多区与多地域
| 拓扑 | 获得 | 付出 / 关键决策 |
| 单区 | 最低成本与复杂度 | 区级故障中断;适合可恢复、非关键或开发环境 |
| 同地域多可用区 | 抵御单区故障,延迟较低 | 跨区成本、状态复制、仲裁与真实故障域验证 |
| 多地域主备 | 区域灾难恢复与数据驻留选项 | RPO/RTO、故障转移、DNS、数据复制、回切和演练 |
| 多地域双活 | 全球低延迟与更高连续性 | 一致性、冲突、容量、运营和成本显著增加;只用于被业务证明的路径 |
多云与可移植性的现实
“未来可能迁移”不足以支撑同时运营多云。先定义要保护的对象:数据可导出、应用可重建、身份不锁死、核心契约开放、退出时间和成本可接受。真正的多云还要支付双平台技能、联网、可观测、安全、数据一致性和故障演练成本;常见更务实做法是主云 + 可恢复数据 + 可替换边界。
成本架构(FinOps 思维)
Unit economics单位经济性
每订单、租户、活跃用户、GB 或模型任务成本,而非只看总账单。
Allocation归属与透明
所有资源有产品、环境、所有者与成本标签;共享成本有分摊规则。
Guardrails预算护栏
预算、异常检测、配额、生命周期与高成本动作审批。
Optimize持续优化
先消除闲置,再调整规格、存储层级、承诺折扣和架构。
Value成本对应价值
便宜但拖慢业务不一定更优;用业务产出和 SLO 共同评估。
Sustainability少做无价值工作
提高利用率、减少数据搬运和重算,按需求选择地域与计算规模。
建设还是购买
差异化业务能力值得自建;数据库、消息、身份、可观测等无差异基础能力通常优先托管。比较的不只是许可证,而是三年总拥有成本、技能稀缺、可靠性责任、退出能力和机会成本。
从关键用户旅程定义 SLI 和 SLO,再用错误预算平衡交付速度与可靠性投资。高可用、备份和灾难恢复解决的是不同问题,必须分别设计、验证和演练。
SLI、SLO、SLA 与错误预算
IndicatorSLI
用户可感知行为的测量,例如成功请求比例、在阈值内完成的订单比例。
ObjectiveSLO
SLI 在某时间窗口内的内部目标,例如 30 天滚动成功率 ≥ 99.95%。
AgreementSLA
对外承诺及未达标后果,通常应比内部工程目标更宽松。
Budget错误预算
1 − SLO,把可接受失败转化为共同的变更与投资信号。
Google SRE 将 SLO、消除琐事、监控、发布、事故响应与复盘放在同一套可靠性实践中;100% SLO 通常意味着无法承担持续变更的成本。[11]
“几个九”在 30 天窗口意味着什么
| 目标 | 允许失败时间(约) | 设计含义 |
| 99% | 7 小时 12 分 | 适合非关键或有人工替代的能力 |
| 99.5% | 3 小时 36 分 | 需要基本冗余、监控与恢复流程 |
| 99.9% | 43 分 12 秒 | 发布、依赖、容量和故障恢复都需工程化 |
| 99.95% | 21 分 36 秒 | 单点、变更失败和第三方依赖会迅速吃完预算 |
| 99.99% | 4 分 19 秒 | 通常需要自动恢复、强隔离、严格变更和高成本冗余 |
数字按 30 天计算,仅用于直觉。实际应使用成功事件比例、业务窗口或用户旅程 SLI;“不可用分钟”并非所有系统的最佳度量。
好的 SLI 从用户结果出发
| 旅程 | 候选 SLI | 不要只用 |
| 登录 | 正确凭据下成功建立会话且 < 1 s 的请求比例 | 身份服务器进程在线率 |
| 下单 | 未重复扣款且 30 s 内得到最终状态的订单比例 | 入口 HTTP 200 比例 |
| 搜索 | 有结果、数据新鲜且 p95 < 300 ms 的查询比例 | 平均延迟或 CPU |
| 数据管道 | 截止时间前完整、准确到达的分区比例 | 作业“成功”状态 |
| AI 助手 | 在延迟/成本预算内被评估为可接受且有依据的任务比例 | 模型 API 可用率 |
可靠性分层
预防简化、容量、自动化
→
检测SLI、症状告警、审计
→
限制舱壁、单元化、降级
→
恢复故障转移、回滚、还原
→
学习无责复盘、适应度函数
RTO、RPO 与灾备策略
RTO 是业务可接受的恢复时间,RPO 是可接受的数据丢失窗口。两者应按业务能力分级,包含依赖和人员,不应只写数据库参数。
| 策略 | 典型恢复速度 | 成本 | 必须验证 |
| 备份与还原 | 小时到天 | 低 | 备份完整性、密钥、基础设施重建、日志追赶、业务验收 |
| Pilot Light | 数十分钟到小时 | 中低 | 最小核心常驻,扩容、依赖与数据同步能否及时完成 |
| Warm Standby | 分钟级 | 中高 | 缩小容量是否承载切换期负载,DNS/路由与回切 |
| 多地域双活 | 秒到分钟 | 高 | 写冲突、一致性、容量、依赖相关性、自动/人工切换边界 |
串联系统的可用性会相乘
若一次请求必须顺序依赖三个各 99.9% 可用的独立服务,粗略联合可用性约为 99.7%,还未计网络与应用本身。冗余只有在故障相互独立、容量足够、切换路径被验证时才改善结果。
监控四个黄金信号
Latency延迟
区分成功与失败请求,关注阈值分布和尾延迟。
Traffic流量
请求、任务、事件、字节或并发,映射实际需求。
Errors错误
显式失败、错误结果、超时、降级和违反策略。
Saturation饱和度
最受限资源接近上限的程度与排队增长。
叫醒人的告警应同时满足:紧急、用户可感知、需要立即行动。原因型指标适合诊断;症状型 SLO 燃烧率更适合寻呼。为快故障与慢消耗使用多窗口、多燃烧率策略。
事故与复盘
- 指挥与沟通:设事故指挥、操作、沟通和记录角色;先稳定影响再找根因。
- 时间线与影响:基于证据记录用户、业务、数据和合规影响,避免记忆重构。
- 促成因素:设计、流程、组织、容量、依赖、变更和检测如何共同作用。
- 无责学习:区分直接触发与系统性条件,不把“操作失误”当最终答案。
- 行动闭环:每项行动有负责人、截止、优先级和验证;跟踪到完成并更新运行手册。
混沌与 Game Day
先写稳态假设、保护指标、实验范围、停止条件和回滚路径,再从非生产和小爆炸半径开始。测试的不只是实例重启,还应包括:依赖变慢、限额耗尽、证书过期、控制面不可用、区域隔离、消息积压、错误配置和人工接管。
错误预算策略示例
- 预算健康:保持正常发布节奏,继续小批量交付。
- 预算快速燃烧:冻结高风险变更,增加审查与自动回滚,优先修复可靠性。
- 预算耗尽:产品与工程共同决定仅发布修复、是否降低功能目标或调整 SLO。
- 长期几乎不消耗:目标可能过宽或投入过度,应重新评估业务价值和成本。
错误预算是跨职能决策工具,不是绩效排名或追责机制。
不要从“加缓存、加机器”开始。先建立负载模型和延迟预算,识别排队与饱和点,再用最小改动验证瓶颈。平均值会隐藏真正伤害用户的尾延迟。
性能模型的六个量
Latency延迟分布
p50 看典型体验,p95/p99 看长尾;区分服务时间与排队时间。
Throughput吞吐
每秒请求、事件、订单、字节或 token;明确成功口径。
Concurrency并发
同时在系统内的工作量;连接、线程、任务和锁都可能受限。
Utilization利用率
资源忙碌比例。接近 100% 时排队通常非线性增长。
Saturation饱和
排队、拒绝、池等待、限流或 GC 表示需求超过即时能力。
Errors错误与超时
压测时吞吐提高可能只是快速失败;必须与正确性一起看。
Little’s Law
稳定系统中,平均在途量 L = λ × W。若到达率为 1,000 请求/秒、平均响应时间为 0.2 秒,则平均约 200 个请求在系统内。它能帮助估算连接池和并发,但前提是系统稳定、窗口定义一致。
端到端延迟预算
| 阶段 | 预算示例 | 观测点 | 优化方向 |
| 网络 / CDN / 网关 | 80 ms | 区域、握手、缓存命中 | 就近、连接复用、压缩、缓存 |
| 应用排队与业务 | 100 ms | 队列时间、线程/事件循环 | 减小临界区、并发、隔离、负载卸除 |
| 数据访问 | 70 ms | 慢查询、锁、缓存、扫描量 | 索引、查询重写、批量、读模型 |
| 下游依赖 | 100 ms | 每个依赖分位数与超时 | 并行、减少调用、异步、回退 |
| 序列化与余量 | 50 ms | 载荷大小、CPU、GC、抖动 | 裁剪字段、流式、协议、预留安全边际 |
扩展的基本手段
Scale up纵向扩展
更强单机,简单且低协调,但有上限和更大单点。适合数据库早期阶段或内存密集工作负载。
Scale out水平扩展
增加副本,要求状态外置或可分区;带来负载均衡、协调和一致性问题。
Partition分片 / 单元化
按租户、地区、业务键拆容量与爆炸半径。分区键决定热点、查询和迁移成本。
Async异步与批量
削峰、提高吞吐、合并 I/O;牺牲即时结果并需要积压、重试和幂等治理。
缓存优化的顺序
- 先证明慢在哪里,避免缓存错误或低频路径。
- 定义可接受陈旧窗口和失效责任。
- 选择缓存位置:浏览器、CDN、网关、应用、本地或数据层。
- 设计命中率、键空间、容量、TTL、预热、穿透与击穿。
- 故障时决定绕过、使用陈旧值还是拒绝;监控源系统回源压力。
- 保护隐私:认证响应、租户数据和含敏感字段的缓存键不能串用。
性能测试类型
| 测试 | 回答的问题 | 关键做法 |
| 基准测试 | 版本或实现的相对变化? | 环境可重复,隔离噪声,关注统计分布 |
| 负载测试 | 目标负载下是否满足 SLO? | 真实请求混合、数据量、缓存状态和思考时间 |
| 压力测试 | 极限在哪里、怎样失败? | 逐步加压,观察饱和、拒绝、恢复与数据正确性 |
| 尖峰测试 | 突发到来时弹性是否及时? | 测试冷启动、扩容滞后、队列和限流 |
| 浸泡测试 | 长时间是否泄漏或退化? | 持续数小时/天,观察内存、句柄、碎片、存储增长 |
| 故障负载测试 | 故障与高负载叠加会怎样? | 减少实例、依赖变慢、区域退出,验证剩余容量 |
容量计划简表
CAPACITY MODEL
当前基线:峰值需求 / 请求混合 / 数据量 / 区域 / 读写比
增长模型:业务增长 + 季节/活动系数 + 安全余量
单实例实测能力:满足目标分位数与错误率时的吞吐
故障容量:失去一个节点/区/地域后,剩余容量仍满足哪一级目标
扩容滞后:指标采集 + 决策 + 启动 + 预热总时间
有界资源:连接、线程、队列、文件、内存、磁盘、配额、下游限额
单位成本:每 1,000 请求 / 订单 / GB / AI 任务
触发点:何时扩容、分片、归档、重构或改变产品策略
常见性能反模式
- 只看平均延迟;没有请求量、分位数和错误率。
- 无限队列“防止丢请求”,最终把延迟和内存推到不可恢复。
- 把数据库连接池开得很大,实际只把拥塞推到数据库。
- 过早分片,导致跨分片事务、查询与迁移复杂度远超收益。
- 负载生成器先饱和,或测试数据与生产基数完全不同。
- 自动扩缩容只看 CPU,而瓶颈其实是队列、连接、令牌或下游配额。
从资产、威胁、信任边界和业务影响开始,用最小权限、分层防御和可验证控制降低风险。安全架构要同时保护运行系统与“生产软件的系统”——源代码、依赖、构建、制品和发布渠道。
NIST CSF 2.0:六个持续职能
Govern治理、风险偏好、责任
→
Identify资产、风险、供应链
→
Protect身份、数据、平台
→
Detect监控、分析、异常
→
Respond / Recover遏制、沟通、恢复、改进
CSF 2.0 于 2024 年正式发布,新增 Govern 并强化供应链治理;可用 Current/Target Profile 表达当前与目标状态,而不是把 Tier 当成认证分数。[12]
威胁建模:围绕数据流和信任边界
明确范围与资产
关键业务动作、数据、身份、秘密、模型、制品和可用性资源。
画数据流与信任边界
进程、存储、外部实体、协议、身份变化、跨租户/区域/组织流动。
系统化枚举威胁
可用 STRIDE:伪装、篡改、抵赖、信息泄露、拒绝服务、权限提升。
按业务风险排序
影响、可能性、暴露、可探测性与监管后果;避免平均用力。
选择控制并验证剩余风险
预防、检测、响应、恢复;明确所有者、测试、证据与接受人。
零信任不是“买一套产品”
Policy Engine策略引擎(PE)
基于身份、设备/工作负载态势、资源、风险与环境作授权决定。
Policy Administrator策略管理(PA)
执行决定,建立或终止通信路径、下发短期凭据。
Enforcement策略执行点(PEP)
尽量靠近资源,拦截请求、默认拒绝并记录每次关键决定。
NIST SP 800-207 的核心是保护资源而非隐式信任网络位置;用户、设备和工作负载持续认证与授权。云原生补充 SP 800-207A 强调应用/服务身份与细粒度策略。[13]
- 默认拒绝;最小权限、短时凭据、MFA、工作负载身份与 mTLS。
- 高风险动作重新评估上下文并 step-up;授权不能只在登录时发生一次。
- 单独保护策略系统、身份源与遥测;验证其故障时是 fail-safe 还是有限降级。
- 微分段限制横向移动,但不能替代应用内对象、字段和业务动作授权。
NIST SP 1800-35 已于 2025 年正式发布,给出 19 个基于商用技术的零信任参考实现与经验,可用于从原则进入实施验证。[29]
身份、授权与秘密
| 主题 | 架构要求 | 常见失败 |
| 认证 | 集中身份、强验证、会话生命周期、恢复与撤销 | 把认证等同授权;长期令牌无法撤销 |
| 授权 | 服务端对租户、对象、字段、功能和业务上下文逐项判断 | 只在 UI 隐藏按钮;仅凭对象 ID;管理员角色无限扩大 |
| 工作负载身份 | 每服务独立身份、自动轮换、调用范围最小 | 共享静态 API Key;凭网络位置互信 |
| 秘密 | 专用秘密存储、短时注入、轮换、泄漏检测与紧急吊销 | 进入代码、镜像、日志、事件或 AI 上下文 |
| 加密 | 传输、静态及高风险字段;密钥与数据分权、生命周期一致 | “已加密”但密钥同库、无轮换、备份未覆盖 |
应用安全基线:Top 10 不是验收标准
OWASP Top 10:2025 是风险意识文档;ASVS 5.0.0(2025 年发布)才提供可测试的 Web 应用安全控制基线。引用 ASVS 要带完整版本化控制 ID,例如 v5.0.0-x.y.z。[14][15]
Input不信任输入
Schema、允许清单、规范化、参数化查询与上下文输出编码。
Abuse防业务滥用
限流、配额、反自动化、风控、成本上限和异常行为检测。
Inventory资产可发现
API、版本、域名、证书、数据流与所有者清单,含废弃机制。
Evidence证据化验证
SAST、DAST、依赖/容器/IaC 扫描、渗透测试与运行审计相互补充。
软件供应链:三个问题、三类证据
ContentsSBOM · 包含什么
组件、版本、唯一标识、哈希、许可证和依赖关系;使用 SPDX 或 CycloneDX 等机器可读格式。
ProcessProvenance · 怎样构建
源、构建器、步骤、输入与产物摘要;SLSA 提供逐步提高来源与构建保证的框架。
Integrity签名 / 证明 · 是否被改
签名绑定摘要并验证受信身份;发布入口和部署策略必须真正检查。
ResponseVEX / 情报 · 如何处置
漏洞、可利用性、已知被利用清单、责任人、到期复核、修复与吊销闭环。
供应链工程基线
- 受保护分支、MFA、最小权限;关键变更双人评审,仓库与 CI 审计可追踪。
- 依赖、工具和基础镜像按 digest/hash 固定,禁止仅依赖可变标签。
- 构建使用短生命周期隔离环境,CI 秘密最小化;制品不可变、可吊销、可回滚。
- 每次发布生成并绑定 SBOM、签名 provenance;部署入口验证受信构建器和策略。
- 自动关联资产、漏洞情报与 VEX;第三方组件有准入、升级、淘汰和应急替换计划。
NIST SSDF 1.1 是安全软件开发实践基线;SLSA 当前批准版为 v1.2。CycloneDX 当前规范 1.7 可表达组件、服务、依赖、漏洞、构建、ML 模型等供应链信息。[16][17][18]
隐私工程
- 明确用途和合法依据;只采集完成用途所需的最少数据。
- 数据分类驱动访问、加密、脱敏、保留、驻留和审计。
- 将删除传播到缓存、搜索、分析、副本、备份策略与向量索引;记录例外。
- 尽量使用匿名化、假名化、令牌化和聚合;评估重识别风险。
- 为访问、更正、导出、删除和申诉设计可操作流程,不靠临时脚本。
SECURITY REQUIREMENT
资产 / 业务动作:
威胁主体与场景:
信任边界与数据分类:
预防控制:
检测与审计证据:
响应、遏制与恢复:
控制失败时的安全行为:
验证方法(测试、演练、审计、监控):
剩余风险、接受人、复审日期:
本章用于架构学习,不替代适用地区、行业和组织的法律、合规或专业安全评估。
把反馈做快,把批量做小,把证据自动化。持续交付不是“每天上线”,而是系统始终处于可部署状态,任何变更都能以低风险按需发布。
一条可信的交付供应链
提交评审、签名、秘密扫描
→
构建隔离、可重复、SBOM
→
验证多层测试、策略、证据
→
发布不可变制品、渐进流量
→
观察与回退SLO、业务、成本、安全
发布策略
| 策略 | 优点 | 代价 / 前提 |
| Recreate | 简单、无多版本兼容 | 有停机;适合非关键内部系统或计划窗口 |
| Rolling | 资源增量小、平台普遍支持 | 新旧版本共存;需向后兼容、就绪探针和失败回滚 |
| Blue–Green | 切换快、回退直观、环境完整 | 双份容量、数据迁移与外部副作用不能只靠切流回退 |
| Canary | 小爆炸半径、用真实流量验证 | 需要分群、足够样本、自动判定与停止条件 |
| Feature Flag | 部署与功能发布解耦、可按用户控制 | 组合爆炸、旧旗标清理、服务端授权不能由旗标替代 |
| Shadow | 复制真实输入验证新系统,不影响响应 | 隐私、成本、外部副作用隔离、结果比较 |
测试组合:按风险建立证据
Fast单元 / 领域
快速验证业务规则、不变量和边界内行为,数量最多。
Boundary组件 / 端口
以真实组件验证数据库、消息、序列化和适配器契约。
Contract消费者驱动契约
验证服务可独立演进;不能代替业务端到端流程。
Integrated集成 / E2E
覆盖少量关键旅程、身份、部署与真实依赖;稳定性比数量重要。
Qualities质量属性
性能、韧性、灾备、安全、可访问性、兼容性和成本测试。
Architecture适应度函数
自动检查依赖方向、循环、契约、SLO、策略和技术债趋势。
可观测性:从未知问题推断内部状态
| 信号 | 擅长回答 | 设计注意 |
| Metrics | 趋势、聚合、SLO、容量、告警 | 控制标签基数;业务与技术指标同图;保留与降采样 |
| Traces | 请求跨边界去了哪里、耗时和错误在哪 | 上下文传播、采样、异步链接、敏感属性 |
| Logs | 离散事件、上下文、审计与详细诊断 | 结构化、级别、脱敏、关联 ID、成本和不可篡改需求 |
| Profiles | 持续 CPU/内存热点与代码路径 | 生产开销、符号、采样与隐私 |
| Events / Changes | 部署、配置、特性开关、事故与业务变化 | 把变化叠加到遥测,避免只看结果不看触发 |
OpenTelemetry 提供厂商中立的追踪、指标、日志和上下文传播模型;它解决采集与语义互操作,不替你决定什么值得测、如何告警和保留多久。[19]
DORA 已从“四项”演进为五项指标
Throughput变更前置时间
从代码提交到成功运行在生产的时间。
Throughput部署频率
在一段时间内发布到用户的频率。
Throughput失败部署恢复时间
由生产变更导致故障后恢复所需时间。
Instability变更失败率
需要立即修复、回滚或热修的部署比例。
Instability部署返工率
为解决生产用户问题而进行的非计划部署比例。
Use well按同一应用看趋势
用于团队改进,不跨异质系统排名,更不能衡量个人。
DORA 当前明确使用“吞吐 + 不稳定性”的五指标模型,并指出速度与稳定性通常不是对立面。[20]
架构适应度函数示例
| 意图 | 自动验证 | 人工 / 运行验证 |
| 模块边界 | 禁止循环与越层依赖;包/模块可见性测试 | 领域语言与所有权评审 |
| API 兼容 | Schema diff、契约测试、废弃使用遥测 | 消费者迁移与业务语义确认 |
| 可靠性 | SLO、燃烧率、超时/重试配置检查 | Game Day、恢复和容量演练 |
| 安全 | 策略、依赖、制品、IaC 与秘密扫描 | 威胁建模、渗透测试、风险接受 |
| 成本 | 预算、标签、单位成本、异常与闲置检测 | 价值、可靠性与锁定权衡 |
部署完成 ≠ 发布成功
渐进式发布要同时检查技术 SLI、业务转化、数据正确性、安全拒绝、成本和长尾分群;自动回滚规则必须避免在数据迁移或外部副作用后制造更大损失。
架构治理的最小闭环是:原则与安全默认值 → 轻量决策记录 → 自动护栏 → 风险分级评审 → 运行反馈 → 例外到期。它服务交付与风险,而不是服务文档数量。
从“关卡”到“护栏”
Low risk标准路径自动通过
团队使用批准模板、托管能力和默认策略,自助交付;通过流水线保存证据。
Medium risk同行评审 + ADR
新数据流、跨域契约、重要依赖或显著成本,进行时限明确的异步/工作坊评审。
High risk专项证据评审
监管、单向门、重大安全、跨地域数据、核心身份或不可逆迁移,需要原型、威胁和恢复证据。
Exception例外有期限
记录理由、风险接受人、补偿控制、到期日和退出计划;到期自动提醒而非永久豁免。
团队是架构的一部分
Stream-aligned价值流团队
围绕业务结果端到端交付和运行,边界应控制在可承受认知负荷内。
Platform平台团队
把共同能力产品化,降低其他团队认知负荷,不成为代运维工单池。
Enabling赋能团队
短期帮助团队跨越新能力缺口,以知识转移而非永久依赖为目标。
Complicated subsystem复杂子系统团队
拥有算法、编解码、模型或特殊硬件等高专门化能力,提供清晰接口。
- 一个运行单元必须有明确团队所有者、SLO、值班和成本责任。
- 共享库、数据库和平台能力也需要产品式所有权与弃用机制。
- 依赖图应能映射到团队;频繁跨团队协调是边界或平台问题的信号。
- 避免“架构师决定、团队接单”;决策者应与实现和运行后果保持接近。
架构治理资产
| 资产 | 用途 | 健康信号 |
| 原则 | 少量稳定的决策方向 | 有冲突解决作用,不是无人记得的口号 |
| 参考架构 / 黄金路径 | 把成熟选择和控制产品化 | 采用率、任务成功、例外原因、用户满意度 |
| ADR | 保存背景、取舍和演进触发器 | 能追溯现状;状态、替代关系与实现一致 |
| 技术雷达 | 试验、采用、保留、避免的共同语言 | 有证据和复审日期,不追热点、不封死探索 |
| 风险 / 技术债台账 | 让已知问题有所有者和经济后果 | 按风险排序、有触发器和偿还动作 |
| 服务 / 数据目录 | 发现所有者、契约、依赖、SLO 和生命周期 | 自动同步,废弃和孤儿资产可见 |
企业架构与解决方案架构如何衔接
企业架构关注跨组织的业务、数据、应用与技术组合及迁移路线;解决方案/软件架构关注具体系统和工作负载。TOGAF 10th Edition 可用于组织企业架构能力与 ADM 迭代,但不应把项目文档变成全量 TOGAF 制品。[21]
业务战略能力、价值流、风险偏好
→
组合与原则目标状态、标准、平台
→
解决方案驱动质量、范围、约束
→
ADR 与实现结构、契约、部署
→
运行证据SLO、成本、交付、风险
技术债:描述后果,不只描述“代码不好”
TECH DEBT / RISK ITEM
ID / 标题 / 所有者:
产生背景与当时决策:
当前症状与证据:
受影响的业务、质量场景、团队和数据:
利息:每次变更延迟 / 事故 / 额外成本 / 安全暴露
触发器:达到什么条件必须处理
选项:偿还 / 降低 / 隔离 / 接受 / 淘汰
预估成本、优先级、目标日期:
完成与验证标准:
遗留系统现代化:按能力和风险切片
| 策略 | 何时用 | 提醒 |
| Retain | 稳定、低成本、变化少、风险可接受 | 保留不等于无人维护;要有所有者、恢复和生命周期 |
| Retire | 无使用、重复或不再创造价值 | 先用遥测确认消费者,处理数据保留与审计 |
| Rehost | 数据中心退出、时间紧、先搬后改 | 技术债与运营模型不会自动改善 |
| Replatform | 用托管运行时/数据库降低运维 | 验证兼容、锁定、性能和迁移回退 |
| Refactor / Rearchitect | 结构严重阻碍业务变化、可靠性或成本 | 围绕业务能力逐步演进,避免大爆炸重写 |
| Replace / Repurchase | 能力通用、购买比自建更有价值 | 数据迁移、流程适配、供应商退出和集成总成本 |
绞杀者式演进
建立可观测边界
测出功能使用、依赖、数据流、错误与成本,先知道真实系统。
在入口建立路由缝
网关、代理、消息、数据库变更捕获或抽象层,保留回退。
选择高价值低耦合切片
按业务能力和用户旅程,不按技术层或表逐步迁移。
迁移数据所有权
定义主记录、双写/同步窗口、校验、切换和删除旧路径。
关闭旧能力
使用遥测证明无人调用,归档数据,撤销权限和基础设施,回收成本。
治理的反指标
评审数量、文档页数、统一技术栈比例和“无例外”不代表好治理。更有意义的是:决策前置时间、标准路径采用与任务成功、例外到期、风险关闭、交付表现、事故和单位成本趋势。
AI 应用不是“模型 API + Prompt”。它包含数据、检索、策略、编排、工具、输出验证、人工监督、评估和运行控制;模型输入与输出都应视为不可信数据。
生产级 AI 应用参考结构
AI SYSTEM · 确定性控制包围概率核心
入口 / 身份租户、配额、用途
→
策略与输入处理PII、注入、分类
→
编排与检索上下文、记忆、路由
→
模型 / Agent概率推理与计划
→
验证 / 工具 / 人审Schema、权限、审批
横切:版本、追踪、离线/在线评估、成本、审计、反馈、回退、Kill Switch。
AI 系统的质量属性
| 属性 | 候选指标 | 架构手段 |
| 正确 / 有依据 | 任务成功、faithfulness、引用精度/覆盖、正确拒答 | RAG、结构化数据、验证器、来源引用、人工升级 |
| 安全 / 合规 | 有害输出、注入成功、数据泄露、越权工具调用 | 模型外策略、最小权限、沙箱、输出校验、红队 |
| 可靠 / 可恢复 | 可接受响应率、降级成功、漂移、依赖失败影响 | 模型路由、确定性回退、超时、幂等、Kill Switch |
| 性能 / 成本 | 各阶段 p95/p99、token/任务、被接受任务成本 | 小模型优先、缓存、批量、上下文预算、级联路由 |
| 新鲜 / 可追溯 | 知识年龄、索引延迟、答案可重建率 | 数据契约、版本、血缘、删除传播、检索日志 |
| 公平 / 人因 | 语言/群体差异、自动化偏差、人工覆盖与申诉 | 分层评估、明确不确定性、人工确认、反馈渠道 |
| 可维护 | 变更回归、回滚时间、供应商切换成本 | 模型/Prompt/索引版本化、评估门禁、适配层 |
RAG 的离线与在线两条管道
Offline · Indexing知识入库
来源准入 → 解析/规范化 → 分类与 ACL → 分块 → 嵌入 → 索引 → 质量与血缘。必须保留来源、版本、哈希、租户、保留和删除元数据。
Online · Answering检索回答
身份/策略 → 查询理解 → ACL 前置检索 → 重排 → 上下文构造 → 生成 → 引用/Schema/安全验证 → 响应或拒答。
Freshness新鲜度与删除
定义接入延迟 SLO、tombstone、重建/回填、版本切换与对账;删除必须传播到 chunk、向量和缓存。
Evaluation分层评估
分别评估解析、召回、重排、生成、引用、策略和端到端任务,避免只看最终“感觉不错”。
评估体系(Evals)
按用例定义可接受结果
正确、完整、有依据、无害、延迟和成本;包含明确拒答条件。
建立版本化黄金集
真实分布、长尾、空结果、冲突、过期、多语言、权限和对抗样本。
离线回归门禁
模型、Prompt、工具、chunker、embedding、索引或数据变更都要跑。
小流量 Canary / A-B
检查线上任务成功、人工纠正、安全、延迟、成本与分群差异。
生产抽样与反馈闭环
人工审查高风险样本,监测漂移、投诉与失败簇,回补测试集。
可重建一次回答需要记录:模型和参数、Prompt 模板、策略版本、embedding/index/data 版本、检索 chunk ID/score/ACL、工具请求/响应、验证决定和 trace;同时对敏感内容脱敏并限制访问。
RAG / Agent 威胁与控制
| 威胁 | 架构控制 |
| 直接 / 间接 Prompt Injection | 区分指令与数据通道;检索文本始终不可信;模型外授权;对抗评估与安全拒答 |
| 来源投毒 / 隐藏文本 / 解析混淆 | 来源允许清单、签名/哈希、审批、恶意文件扫描、规范化、可追溯入库 |
| 跨租户检索 / ACL 丢失 | ACL 与分类绑定到每个 chunk;服务端检索前过滤;高敏索引隔离与越权测试 |
| 敏感信息泄露 | 数据最小化、PII/secret 过滤、脱敏日志、输出策略、供应商数据处理约束 |
| 不安全输出处理 | 结构化 Schema + 语义验证;参数化 API;输出不直接进入 SQL、Shell、HTML 或浏览器动作 |
| 过度代理权 / 工具滥用 | 工具允许清单、短时最小权限、每动作 scope/预算、高影响操作人审与可撤销设计 |
| 资源消耗无界 | token/检索 fan-out/工具次数/时间/费用预算,速率与并发限制,递归深度和 Kill Switch |
| 模型/数据/依赖供应链 | 来源、许可证、版本、评估、签名/SBOM、提供商变更监测和退出路径 |
OWASP LLM/GenAI Top 10 2025 覆盖 Prompt Injection、敏感信息、供应链、投毒、输出处理、过度代理权、系统提示泄露、向量/嵌入弱点、错误信息与无界消耗;它是威胁意识基线,不替代完整威胁模型。[22]
Agentic AI 的确定性护栏
Identity每个代理有身份
短时凭据、最小工具范围、租户上下文,不共享万能账号。
Approval高影响动作人审
付款、发送、删除、发布、改权限等在执行前展示明确摘要。
Sandbox隔离执行
限制网络、文件、代码、CPU、时间和费用;输出再验证。
Control可停止与可追责
幂等、审计、预算、异常告警、人工接管、Kill Switch 和回滚。
任何 Prompt、系统提示或模型 guardrail 都不是授权机制。即使模型“承诺不做”,高影响控制也必须由模型外的身份、策略、参数验证和执行层强制。
NIST AI RMF:治理贯穿全生命周期
Govern责任、政策、文化、文档
↔
Map场景、主体、影响、风险
↔
Measure测试、评估、监控、证据
↔
Manage排序、处置、沟通、改进
NIST AI RMF 1.0 当前仍是正式基线但正在修订;NIST AI 600-1 是生成式 AI 的正式配套 Profile,强调风险治理、内容来源、上线前测试与事件披露。[23][24]
AI 项目应记录的 ADR
- 为什么此用例适合 AI;哪些结果不能交给概率系统。
- 模型/供应商选择、路由与退出路径;数据是否被用于训练。
- RAG、微调或纯提示的选择;知识源、ACL、刷新与删除。
- 质量、安全、公平、延迟和成本门槛;评估集与批准人。
- 工具权限、人工确认、失败降级、审计、事故与 Kill Switch。
- Prompt、模型、数据、索引和评估版本如何关联与回滚。
最重要的 AI 架构边界
让模型提出建议、计划或结构化候选;让确定性代码验证事实、权限、格式、预算和业务不变量;让人对不可逆、高影响和高不确定动作保留最终决定。
场景:为多个零售品牌提供商品浏览、购物车、促销、库存预占、订单和支付编排。团队从 12 人增长到 4 个价值流团队;先在单地域多可用区运行,并保留区域灾备路径。
架构驱动(假设数据)
Scale规模
20k RPS大促入口峰值;订单写峰值 2,000/s,读写比约 12:1。
Reliability结算 SLO
99.95%30 天滚动;不允许重复扣款,明确处理中状态。
Performance受理延迟
p95 < 600ms峰值时确认已受理;最终状态 30 秒内可查。
Recovery订单恢复
RTO 30m订单 RPO ≤ 5 分钟;支付对账记录 RPO 接近 0。
- 核心不变量:同一幂等键只创建一个订单;支付结果可对账;库存预占有过期和补偿。
- 降级:推荐、评价、个性化失败不影响浏览和结算;促销故障可使用已验证快照或关闭新优惠。
- 约束:团队初期没有 7×24 平台能力;支付由外部机构完成;租户数据必须逻辑隔离并审计。
- 最大风险:大促热点、第三方支付不确定结果、优惠规则复杂度、库存与订单最终一致。
阶段 A:先做清晰的模块化单体
STAGE A · 单地域多可用区 / 模块化单体
Web / App / PartnerCDN · WAF · API Gateway · 身份 · 租户与配额
商品目录、价格视图
购物车 / 促销规则与快照
订单状态机、幂等、Outbox
库存 / 支付适配预占、外部防腐层
关系数据库同一实例,按模块独立 Schema、禁止跨模块直接写
Redis商品/会话/幂等热点
消息 + Worker异步确认、通知、索引
横切运行能力OpenTelemetry · SLO · 审计 · 秘密 · CI/CD · 备份恢复 · 成本标签
为什么不直接微服务:领域边界和促销规则仍在探索,四个团队尚未形成,跨服务一致性与平台成本会延缓市场验证。模块通过代码可见性、架构测试、独立 Schema 和端口隔离,避免退化成“大泥球”。
阶段 B:先扩读路径和异步工作
| 压力 / 问题 | 演进动作 | 不做什么 | 验证 |
| 商品读远多于写 | CDN + 应用缓存 + 搜索派生索引;变更事件驱动刷新 | 不把订单也放入最终一致缓存 | 命中率、陈旧窗口、回源峰值、删除传播 |
| 订单峰值冲击下游 | 受理与执行分离,有界队列、背压、幂等 Worker | 不使用无限队列,不承诺同步完成 | 积压年龄、30 秒最终状态 SLO、重复副作用 |
| 支付超时结果未知 | 外部幂等键、状态机、Webhook 验签、主动查询与对账 | 不盲目重试扣款 | 账实差异、对账时长、未决交易数量 |
| 分析拖慢交易库 | Outbox + CDC 到分析/读模型,按水位对账 | 不让 BI 直连主库跑大查询 | 同步延迟、数据质量、可重建与主从差异 |
阶段 C:用触发器决定是否提取服务
| 候选边界 | 提取触发器 | 提取前准备 | 仍保持模块的理由 |
| 支付编排 | 独立合规、故障隔离和值班;不同发布节奏 | 稳定状态机、幂等、对账、API/事件契约与独立数据 | 若只是少量适配器且同团队拥有,网络化收益有限 |
| 库存 | 写热点、仓网算法专门团队、独立容量与可用性目标 | 预占语义、过期、补偿、版本与分区键 | 库存与订单强事务仍频繁变化时,过早拆会放大一致性成本 |
| 商品搜索 | 查询/索引技术与容量完全不同,已是派生模型 | 索引事件、重建、ACL、陈旧 SLO 和回退查询 | 小规模时托管搜索 + 模块适配器即可 |
| 促销 | 多团队独立规则、发布冲突和计算热点被证实 | 价格快照、规则版本、可解释结果与失败降级 | 与购物车共同变化且规则未稳定时,保持同边界更内聚 |
关键 ADR 示例
| ID | 决定 | 主要理由 | 后果 / 重审触发器 |
| ADR-001 | 以模块化单体起步 | 领域探索与团队规模,优先低运维成本 | 当独立发布/容量/合规收益被量化时重审 |
| ADR-004 | 订单使用客户端幂等键 | 网络超时后客户端必然重试,需避免重复订单 | 键作用域与 48 小时保留;监控冲突率和存储成本 |
| ADR-007 | 业务状态与 Outbox 同事务写入 | 避免数据库 + Broker 双写裂缝 | 至少一次投递,消费者幂等;监控发布延迟 |
| ADR-011 | 单地域多区 + 异地温备 | 当前业务 RTO/RPO 与成本的平衡 | 季度恢复演练;区域收入或监管变化时评估双活 |
| ADR-015 | 租户 ID 强制贯穿身份与数据 | 共享表成本可接受,但必须防跨租户访问 | 数据库行策略 + 服务端授权 + 越权测试;高价值租户可迁独立库 |
上线前故障场景
Dependency支付 10 秒无响应
入口在预算内返回“处理中”;不重复扣款;后台查询与 Webhook 最终收敛。
Overload流量 3 倍突增
非关键能力先降级;有界队列和限流保护结算;剩余容量满足目标。
Data搜索索引落后 15 分钟
展示新鲜度或回退数据库查询;告警水位,索引可重建且不影响订单。
Zone一个可用区退出
剩余区承载峰值;连接、队列、缓存与数据库切换均在演练范围。
Security租户 ID 被篡改
身份上下文覆盖客户端字段;对象级授权拒绝并审计;无跨租户数据返回。
Recovery主库逻辑误删
停止传播、时间点恢复、重放 Outbox、对账并满足 RTO/RPO。
案例结论
系统的成熟不是组件越来越多,而是每次新增复杂度都有明确驱动、可验证收益、清晰所有权和退出路径。先建立模块、幂等、契约、遥测和恢复,再讨论服务数量。
完整软件架构文档骨架
SOFTWARE ARCHITECTURE DOCUMENT · arc42 / ISO 42010 / C4 组合
# 0. 文档控制与阅读指南
- 文档 ID、版本、状态、日期、作者、评审人、责任团队
- 适用系统/版本/环境、变更记录、源仓库与自动生成入口
- 目标读者、各角色阅读路径、图例与术语约定
# 1. 关注实体、目标与范围
- 业务使命、成功指标、关键用户旅程
- 系统职责 / 非目标 / 范围边界 / 假设
- 利益相关者、关切、影响力、期望和验收责任
# 2. 架构驱动与约束
- Top 3–5 质量目标及场景
- 核心领域、不变量、关键数据与信任边界
- 法规、组织、预算、期限、遗留、技术、驻留约束
- 风险、假设、验证动作与最晚决策时间
# 3. 系统上下文
- C4 System Context / Landscape
- 外部用户、系统、设备、组织及所有权
- 业务与技术接口、数据流、SLA、限额、失败行为
# 4. 解决方案策略
- 顶层架构风格、领域分解、数据与集成策略
- 质量属性策略、部署拓扑、关键技术与组织策略
- 选择理由、主要取舍及 ADR 链接
# 5. 静态结构 / 构建块
- C4 Container(必选)与必要的 Component
- 每块的职责、技术、API/事件、数据所有权、团队所有权
- 依赖方向、允许/禁止关系、版本与生命周期
# 6. 运行时视图
- 关键正常路径、异常路径、过载、恢复和管理场景
- 同步/异步、事务、幂等、顺序、超时、重试、降级、补偿、对账
- 序列图或动态 C4;每个场景关联 SLI/SLO
# 7. 部署与运行视图
- 环境、账号/项目、区域/可用区、网络/信任边界
- 软件到运行节点映射、扩缩容、故障域、容量和成本归属
- 配置、秘密、证书、备份、RTO/RPO、灾备与恢复演练
# 8. 数据架构
- System of Record、派生数据、Schema、血缘与数据契约
- 分类、授权、加密、保留、驻留、删除传播、质量 SLO
- 批/流、CDC、重放、对账、分区、主数据与多租户策略
# 9. API / 事件与集成
- OpenAPI / AsyncAPI / IDL、错误与幂等语义
- 身份、授权、配额、版本、兼容、废弃和消费者清单
- 外部依赖防腐层、失败隔离与退出路径
# 10. 横切质量概念
- 安全、可靠性、性能、可观测、测试、交付、可访问性
- 缓存、时间、错误处理、国际化、审计、供应链和 FinOps
- 每项:目标 → 策略 → 证据 → 所有者
# 11. AI / ML(如适用)
- 用例适配、数据/模型/Prompt/索引/工具架构
- Evals、风险、权限、人审、漂移、成本、回退与 Kill Switch
# 12. 架构决策
- ADR 索引:Proposed / Accepted / Deprecated / Superseded
- 重要、昂贵、难逆、跨边界和高风险决定的完整理由
# 13. 质量要求与验证
- 质量树、场景、优先级、验收和生产指标
- 架构适应度函数、性能/安全/恢复/混沌测试
# 14. 风险、技术债和开放问题
- 概率、影响、证据、缓解、剩余风险、接受人、截止与触发器
# 15. 演进路线与治理
- 当前 → 过渡 → 目标状态;里程碑、依赖、回退和成功指标
- 团队边界、评审级别、例外、标准路径、弃用和现代化策略
# 16. 跨视图追溯
利益相关者关切 → 质量场景 → 视图/元素 → ADR
→ 测试/监控证据 → 风险/行动项
# 17. 词汇表与权威参考
ADR 模板
ADR-XXXX · ARCHITECTURE DECISION RECORD
标题:用主动语态写清决定
状态:Proposed / Accepted / Deprecated / Superseded by ADR-…
日期 / 作者 / 决策者 / 参与者:
## 背景
什么问题要求现在决定?业务目标、质量场景、约束和证据是什么?
保持中立,不在背景中偷放结论。
## 决策驱动与评价标准
- 必须满足:
- 希望优化:
- 不在范围:
## 可行选项
0. 不改变 / 延迟决定
1. 方案 A:收益、代价、风险、证据、可逆性
2. 方案 B:收益、代价、风险、证据、可逆性
## 决定
我们将……(范围、负责人、生效日期)
选择理由;未选方案的主要理由。
## 后果
- 正面:
- 负面:
- 中性 / 新责任:
- 受影响系统、数据、契约、团队、成本与运行:
## 验证与跟进
原型 / 测试 / SLO / 成本 / 安全证据:
行动项、负责人、截止:
重审触发器与最晚复审日期:
相关 / 替代 ADR 与文档链接:
架构评审清单
生产就绪检查清单
| 领域 | 最低就绪证据 |
| 所有权 | 产品/工程 Owner、值班、支持渠道、服务/数据目录、升级路径 |
| 部署 | 不可变制品、环境一致、兼容迁移、渐进发布、停止条件、回退/修复前进 |
| 可靠性 | 用户旅程 SLO、症状告警、容量余量、依赖降级、故障演练、错误预算策略 |
| 数据 | 分类、所有权、质量、新鲜度、备份还原、RPO/RTO、保留/删除、对账 |
| 安全 | 威胁模型、最小权限、秘密轮换、漏洞时效、审计、事件响应、供应链验证 |
| 可观测 | 指标/追踪/日志关联,业务与技术看板,基数/采样/保留,变更标记 |
| 运行 | Runbook、常见诊断、手动安全模式、配额/证书/依赖到期、事故角色 |
| 经济性 | 资源归属、预算、单位成本、异常告警、扩容成本和高成本操作护栏 |
| 合规 | 适用义务、证据位置、数据驻留、第三方责任和风险接受 |
C4 图审查速查
Scope看得出范围吗?
图类型、系统、环境、版本、读者、边界与图例清楚。
Elements元素能自解释吗?
名称、类型、职责、技术、所有者和抽象层级一致。
Relations箭头有意义吗?
方向、意图、数据、协议和同步/异步明确,无装饰线。
Risk关键风险可见吗?
信任、数据、故障、部署和团队边界按图目的表达。
Trace能追溯吗?
图元素与 ADR、契约、代码/部署、SLO 和风险项关联。
Fresh仍然是真的吗?
最后更新时间、负责人和源模型明确;过期图被标记或删除。
C4 官方提供更完整的架构图评审清单,可作为团队标准的起点。[25]
90 分钟架构评审议程
10 分钟 · 决策请求
要决定什么、最晚时间、范围与谁承担后果。
15 分钟 · 驱动与上下文
业务、质量、约束、边界、当前证据,不先讲产品清单。
20 分钟 · 方案与取舍
至少两个选项、保持现状、可逆性、成本和团队适配。
25 分钟 · 风险风暴
正常、故障、过载、安全、恢复和变化场景;独立提出再排序。
15 分钟 · 结论
接受、需证据、延迟或拒绝;记录 ADR、风险、所有者和期限。
5 分钟 · 复盘评审
是否回答了决策问题,哪些材料可以下次自动化或删减。
12 周实践路线
| 周 | 主题 | 学习重点 | 必须产出 |
| 01 | 架构思维 | 业务目标、利益相关者、架构驱动、范围 | 一页驱动画布 + 系统上下文 |
| 02 | 质量属性 | 场景六要素、量化、权衡和效用树 | 8 个质量场景,排序 Top 3–5 |
| 03 | 文档与决策 | ISO 42010、C4、arc42、ADR | 上下文/容器图 + 3 个 ADR |
| 04 | 模块与领域 | DDD、耦合维度、六边形、团队边界 | 领域地图 + 模块依赖规则 |
| 05 | 架构风格 | 模块化单体、微服务、事件、Serverless | 三方案权衡表 + 推荐与反对理由 |
| 06 | 分布式系统 | 时间预算、幂等、一致性、Saga、Outbox | 一条失败运行时序列 + 重放实验 |
| 07 | 数据与集成 | 主记录、契约、质量、血缘、API/事件演进 | 数据产品卡 + API/事件契约 |
| 08 | 云与平台 | Well-Architected、Kubernetes 取舍、IaC、FinOps | 部署视图 + 三年成本/单位成本模型 |
| 09 | 可靠性与性能 | SLI/SLO、RTO/RPO、容量、压测、故障隔离 | SLO + 容量表 + 恢复 Game Day |
| 10 | 安全与供应链 | 威胁建模、零信任、ASVS、SSDF/SLSA/SBOM | 数据流威胁模型 + 控制验证清单 |
| 11 | 交付与治理 | 渐进发布、可观测、DORA、适应度函数、现代化 | 交付闭环 + 5 个适应度函数 |
| 12 | AI 与综合答辩 | RAG/Agent 风险、Evals、全景权衡 | 完整架构文档 + 30 分钟评审答辩 |
毕业项目评分表
20%问题理解
目标、边界、利益相关者、质量场景和约束是否具体且排序。
20%结构与数据
领域、模块、依赖、所有权、契约和一致性是否有业务依据。
20%运行质量
故障、过载、恢复、安全、性能、成本和可观测是否可验证。
15%决策质量
有真实备选、证据、正负后果、可逆性和重审触发器。
15%演进与团队
路线图小步可回退,所有权与认知负荷匹配,治理不过重。
10%沟通
不同读者能快速找到答案,图表自解释,术语一致,无技术堆砌。
Gate否决项
关键安全/数据风险无人接受,恢复无证据,或方案无法追溯到业务目标。
Pass通过线
总分 ≥ 75%,且没有否决项;能回答“失败时怎样”和“何时重审”。
建议书目:按问题读,不按厚度读
| 方向 | 书 / 资源 | 重点 |
| 基础与权衡 | Software Architecture in Practice;Fundamentals of Software Architecture | 质量属性、架构风格、分析与架构师能力 |
| 演进 | Building Evolutionary Architectures | 适应度函数、增量变化与可演进性 |
| 数据与分布式 | Designing Data-Intensive Applications | 复制、分区、事务、批流与一致性思维 |
| 生产与韧性 | Release It!;Google Site Reliability Engineering | 稳定性模式、SLO、事故、容量与运营 |
| 领域设计 | Domain-Driven Design;Learning Domain-Driven Design | 领域建模、限界上下文和系统边界 |
| 组织 | Team Topologies | 认知负荷、团队类型、交互模式与平台 |
| 安全与可靠 | Building Secure & Reliable Systems;NIST / OWASP 官方资料 | 安全与可靠性的共同设计原则及可验证基线 |
图书可能已有新版本或中文译本,购买/借阅时以出版社最新目录为准。本手册优先引用可在线核对的一手标准和项目文档。
版本锚点(资料核对日:2026-07-30)
| 主题 | 当前锚点 | 状态提示 |
| 架构描述 | ISO/IEC/IEEE 42010:2022,第 2 版 | 2011 版已撤销 |
| 产品质量 | ISO/IEC 25010:2023 | 包含 9 个顶层产品质量特性 |
| arc42 | Version 9 | 官网提供中文模板 |
| 云原生 / Kubernetes | CNCF Definition v1.1;Kubernetes v1.36 | 版本支持周期变化快;ingress-nginx 已于 2026-03 退休 |
| 应用安全 | OWASP Top 10:2025;ASVS 5.0.0 | Top 10 用于意识,ASVS 用于可测试要求 |
| 软件供应链 | SLSA v1.2;CycloneDX 1.7 | 与 SBOM、签名、VEX 和处置流程组合 |
| 交付表现 | DORA 五项指标 | 已从早期“四项指标”演进 |
| AI 风险 | NIST AI RMF 1.0 + GenAI Profile AI 600-1 | AI RMF 1.0 正在修订,1.0 仍为正式基线 |
| LLM 安全 | OWASP LLM / GenAI Top 10 2025 | Agentic Applications Top 10 2026 可作补充 |
权威参考资料
以下链接均为标准组织、项目官方站或原始方法来源。技术与标准会继续演进,实际项目采用前请再次确认版本和适用范围。
核心术语表
- ADR
- 架构决策记录,保存背景、决定、状态与后果。
- 架构驱动
- 会显著改变结构的业务、质量、约束和风险因素。
- 视点 / 视图
- 视点是构建某类表达的约定;视图是针对具体系统的实例。
- 限界上下文
- 一套领域模型和通用语言保持一致的语义边界。
- 聚合
- 维护业务不变量的事务一致性边界。
- 模块化单体
- 单一部署单元,但内部模块有强边界和隐藏实现。
- 最终一致性
- 在没有新更新时,副本经过一段时间收敛;业务需容忍中间状态。
- 幂等
- 同一逻辑操作重复执行不会产生额外业务效果。
- Saga
- 用一系列本地事务和业务补偿实现长事务。
- Outbox
- 业务状态与待发布消息在同一本地事务中写入的模式。
- CDC
- 捕获数据库变更并传播到下游的机制。
- 背压
- 消费者把容量信号反馈给生产者,以限制过载。
- 熔断
- 依赖连续失败时暂时快速失败,并周期探测恢复。
- 舱壁
- 隔离资源和故障,限制爆炸半径。
- SLI / SLO / SLA
- 指标 / 目标 / 带后果的服务协议。
- 错误预算
- 由 SLO 允许的失败空间,用于平衡变化与可靠性。
- RTO / RPO
- 可接受恢复时间 / 可接受数据丢失窗口。
- 可观测性
- 从系统输出推断内部状态、包括未知问题的能力。
- 适应度函数
- 持续验证架构特性是否仍满足意图的自动或人工检查。
- 平台工程
- 把共享能力作为内部产品,以自助和安全默认值降低认知负荷。
- GitOps
- 以版本化声明状态和自动协调管理运行环境的方式。
- 零信任
- 不因网络位置隐式信任,每次访问按身份、资源和上下文评估。
- SBOM
- 软件物料清单,描述制品包含的组件和依赖。
- Provenance
- 制品来源与构建过程的可验证元数据。
- System of Record
- 对某项事实具有最终判定权的主记录系统。
- 数据产品
- 有所有者、契约、质量、可发现性和生命周期的数据能力。
- RAG
- 检索增强生成,用外部证据构造模型上下文。
- Eval
- 用于度量 AI 组件或端到端任务质量、安全、延迟和成本的评估。
- Prompt Injection
- 不可信输入操纵模型偏离预期指令或泄露/执行未授权行为。
- 技术债
- 过去决策在未来变更、风险和运行中持续产生的额外成本。
最后的学习检查
面对任何新技术,先问五件事:它解决哪个已量化问题?替代方案是什么?新增哪些失败模式和组织成本?如何验证收益?退出路径是什么?能持续回答这五问,你学到的就不再只是架构名词。