怎么用这份术语表
这份表不追求词典式的完整定义,只回答三个问题:
- 这个词在本书里指什么;
- 它最容易和哪个词混;
- 第一次系统展开在哪一章。
同一个词在不同团队可能有不同含义。本书的选择是:第一次出现时给英文和用法,之后保持一致;如果某个团队的习惯与本表不同,以团队内部约定为准,但要在 ADR 或接口文档里写清楚。
术语按主题分组,不按拼音排序。想查某个词,用页面搜索比从头翻更快。
一、领域建模
| 中文 | 英文 | 本书用法 | 常见混淆 |
|---|---|---|---|
| 子域 | Subdomain | 业务问题空间的一块划分,按业务能力而非代码分层 | 不等于微服务,也不等于团队 |
| 核心域 | Core Domain | 形成业务差异化、最值得投入自研的部分 | 不等于“最重要的技术模块” |
| 支撑域 | Supporting Subdomain | 必要但不差异化的业务能力,可自研也可采购 | 容易被误当成核心域过度设计 |
| 通用域 | Generic Subdomain | 身份、通知、计费等通用能力,优先用成熟方案 | 不等于“不重要的域” |
| 限界上下文 | Bounded Context | 一个模型保持一致的边界,通常对应一个模块或服务 | 不等于子域;一个子域可有多个上下文 |
| 上下文映射 | Context Map | 上下文之间的合作关系与集成方式 | 不是组织架构图 |
| 聚合 | Aggregate | 一组必须保持一致的对象,作为事务和并发的最小单位 | 不等于数据库表,也不等于模块 |
| 聚合根 | Aggregate Root | 聚合对外唯一入口,外部只能持有它的引用 | 不是“主表主键”的同义词 |
| 实体 | Entity | 有身份、生命周期内身份不变的对象 | 与值对象的区别在身份,不在有没有字段 |
| 值对象 | Value Object | 由属性值定义、不可变的对象 | 不是“没有 ID 的实体”这么简单 |
| 不变式 | Invariant | 聚合在任何合法状态下都必须成立的规则 | 不等于数据库约束;有些只能在领域层保证 |
| 领域事件 | Domain Event | 表达“领域里已经发生的事”,用过去式命名 | 不等于消息队列里的所有消息 |
| 领域服务 | Domain Service | 不属于单个实体、但属于领域逻辑的操作 | 容易退化成“什么都能放的 service 层” |
| 仓储 | Repository | 以聚合为单位提供持久化访问的抽象 | 不是 DAO;不应暴露查询构造器 |
| 事件风暴 | Event Storming | 用命令、事件、聚合、策略快速探索业务边界的 workshop | 不是画流程图,也不是需求评审会 |
| 防腐层 | Anti-Corruption Layer | 隔离外部模型、翻译为内部模型的适配层 | 不是简单的 DTO 转换 |
| 共享内核 | Shared Kernel | 两个上下文共同维护的一小部分模型 | 很容易变成隐式耦合,需明确 owner |
| 客户-供应商 | Customer-Supplier | 下游依赖上游、但上游需考虑下游需求的合作关系 | 与“遵奉者”的区别在话语权 |
| 遵奉者 | Conformist | 下游直接采用上游模型,不做翻译 | 适合上游模型稳定且下游无议价权时 |
| 开放主机服务 | Open Host Service | 上游提供稳定协议供多个下游使用 | 常与“发布语言”一起出现 |
| 发布语言 | Published Language | 上下文集成时共享的、有文档的模型语言 | 不等于内部领域模型 |
二、架构风格与边界
| 中文 | 英文 | 本书用法 | 常见混淆 |
|---|---|---|---|
| 单体 | Monolith | 一个部署单元、一个进程的应用 | 不等于“坏架构”;模块化单体也是单体 |
| 模块化单体 | Modular Monolith | 单进程部署、内部按业务模块划分并约束依赖 | 不是“先随便写,以后再拆” |
| 微服务 | Microservices | 按业务能力独立部署、独立数据所有权的一组服务 | 不等于“模块多”或“用了容器” |
| 事件驱动 | Event-Driven Architecture | 通过事件异步传播状态变化的结构风格 | 不等于“用了 Kafka” |
| Serverless | Serverless | 由平台管理伸缩与运行的函数/托管服务形态 | 不等于“没有服务器” |
| C4 模型 | C4 Model | 上下文、容器、组件、代码四级视图 | 不是四张必须全画的图 |
| 容器 | Container (C4) | 可独立运行或部署的单元,如进程、数据库 | 与 Docker container 不是同一个概念 |
| 组件 | Component (C4) | 容器内的一组职责,通常是包或模块 | 不等于微服务 |
| 端口 | Port | 领域需要的抽象接口,由外层实现 | 不是网络端口 |
| 适配器 | Adapter | 把端口连接到具体技术实现的代码 | 不是“适配器模式”的全部 |
| 六边形架构 | Hexagonal Architecture | 以领域为中心、通过端口隔离外部的结构 | 与“整洁架构”有重叠,不必强行区分 |
| 依赖倒置 | Dependency Inversion | 内层定义接口,外层实现,依赖指向内层 | 不是“把接口放最外层” |
| 架构适应度函数 | Fitness Function | 用自动化检查衡量架构约束是否被满足 | 不等于单元测试覆盖率 |
| 绞杀者模式 | Strangler Fig Pattern | 用新实现逐步替换旧系统,外层路由逐步切流 | 不是“一次性重写” |
| 分支抽象 | Branch by Abstraction | 用抽象层隔离新旧实现,支持并行开发与切换 | 与“双写”不是一回事 |
| 双写 | Dual Write | 同时写新旧两套存储或服务 | 必须配对账,否则会静默不一致 |
| 双读 | Dual Read | 同时读新旧两套实现并比对结果 | 常用于迁移验证,不用于生产主路径 |
| 架构决策记录 | ADR | 记录一次架构决策的背景、备选、结论与后果 | 不是会议纪要 |
| 质量属性 | Quality Attribute | 可用性、性能、安全性等可度量的系统属性 | 不是形容词;必须写成场景 |
| 质量属性场景 | Quality Attribute Scenario | 刺激源、刺激、制品、环境、响应、度量六要素 | 缺度量就不可验收 |
| 技术债 | Technical Debt | 为短期目标做出的、需要未来偿还的设计取舍 | 不是“所有没写的测试” |
三、数据与一致性
| 中文 | 英文 | 本书用法 | 常见混淆 |
|---|---|---|---|
| 本地事务 | Local Transaction | 单个数据库内 ACID 的事务 | 不是“本地代码里的事务” |
| 出站表 | Outbox | 与业务状态同事务写入、由 relay 异步投递的事件表 | 不是消息队列本身 |
| 最终一致 | Eventual Consistency | 允许短时间不一致,但最终收敛到同一状态 | 不是“可以一直不一致” |
| 强一致 | Strong Consistency | 读写都能看到最新已提交状态 | 代价通常落在可用性与延迟 |
| 幂等 | Idempotency | 同一请求执行多次与执行一次效果相同 | 不等于“去重”;去重是实现幂等的一种手段 |
| 去重窗口 | Deduplication Window | 只在一个时间范围内识别重复请求 | 窗口外的重复仍可能发生 |
| 乐观锁 | Optimistic Locking | 用版本号或条件更新检测并发冲突 | 不是“不加锁”;冲突时要处理 |
| 版本号 | Version | 聚合每次变更递增的整数,用于条件更新 | 不是 API 版本号 |
| CQRS | Command Query Responsibility Segregation | 读写模型分离,可分别优化 | 不等于必须用事件溯源 |
| 读模型 | Read Model | 为查询优化的投影,允许与写模型不同步 | 不是“数据库从库”的同义词 |
| 投影 | Projection | 从事件或变更流构建读模型的过程 | 不是数据库视图 |
| 事件溯源 | Event Sourcing | 以事件序列作为状态事实来源 | 不等于“记录操作日志” |
| Saga | Saga | 用一系列本地事务加补偿实现跨服务一致性 | 不是分布式事务的银弹 |
| 补偿 | Compensation | 为已完成的步骤执行反向操作 | 补偿不一定能完全还原,需业务确认 |
| 对账 | Reconciliation | 定期比对两套数据并修复差异 | 不是“出问题后再查” |
| 幂等键 | Idempotency Key | 客户端生成的、用于识别同一请求的键 | 不是业务主键 |
四、接口与通信
| 中文 | 英文 | 本书用法 | 常见混淆 |
|---|---|---|---|
| 资源 | Resource | API 中被命名的业务对象或集合 | 不是数据库表 |
| 命令语义 | Command Semantics | 表达“要做一件事”的接口,通常非幂等 | 与查询语义相对 |
| 契约优先 | Contract First | 先定义接口契约,再实现服务与客户端 | 不是“先写文档再写代码”的形式主义 |
| OpenAPI | OpenAPI Specification | 描述 HTTP API 的机器可读契约 | 不是框架,也不是文档站 |
| 兼容性 | Compatibility | 新版本不破坏既有调用方的能力 | 不等于“接口不变” |
| 弃用窗口 | Deprecation Window | 旧接口从标记弃用到移除的过渡期 | 不是“发个通知就删” |
| 错误码 | Error Code | 调用方可分支处理的稳定标识 | 不是错误消息文本 |
| 超时预算 | Timeout Budget | 端到端允许的总耗时,分配到每一跳 | 不是每跳独立设一个超时 |
| 重试 | Retry | 对可恢复失败再次发起请求 | 不是所有失败都能重试 |
| 退避 | Backoff | 重试间隔逐步增大 | 不等于固定间隔 |
| 抖动 | Jitter | 在退避上加入随机量,避免同时重试 | 不是“随机失败” |
| 熔断 | Circuit Breaker | 下游持续失败时快速失败,避免拖垮调用方 | 不是限流 |
| 限流 | Rate Limiting | 控制单位时间内的请求量 | 不是“降低优先级” |
| 舱壁 | Bulkhead | 用独立资源池隔离故障影响 | 不是线程池的别名 |
| 降级 | Degradation | 关闭非核心功能,保住核心路径 | 不是“出错就返回空” |
五、运行与可用性
| 中文 | 英文 | 本书用法 | 常见混淆 |
|---|---|---|---|
| 部署单元 | Deployment Unit | 一次构建、发布、回滚的最小单位 | 不等于代码模块 |
| 故障域 | Failure Domain | 一个故障可能影响的最大范围 | 不等于机房 |
| 单点 | Single Point of Failure | 失效会导致整体不可用的组件 | 不是“只有一个实例”就算单点 |
| 冗余 | Redundancy | 用多个副本降低单点风险 | 不等于高可用,需配合故障转移 |
| 主备 | Active-Standby | 一个主实例处理流量,备实例待命 | 与“双活”不同 |
| 健康检查 | Health Check | 判断实例是否可接收流量的探测 | 不是“进程还活着” |
| 流量摘除 | Traffic Drain | 发布或故障前把实例从负载均衡中移除 | 不是直接 kill 进程 |
| 灰度 | Canary Release | 让小比例流量先走新版本 | 不等于蓝绿 |
| 蓝绿 | Blue-Green | 两套环境切换,回滚快但成本高 | 不等于滚动发布 |
| 回滚 | Rollback | 把版本或配置恢复到上一稳定状态 | 数据迁移通常不可简单回滚 |
| 配置漂移 | Configuration Drift | 环境之间配置逐渐不一致 | 不是代码分支差异 |
| 密钥轮换 | Key Rotation | 定期更换密钥并保证新旧过渡 | 不是改密码 |
六、组织与治理
| 中文 | 英文 | 本书用法 | 常见混淆 |
|---|---|---|---|
| 康威定律 | Conway’s Law | 系统结构会反映组织沟通结构 | 不是“组织决定一切” |
| 团队拓扑 | Team Topologies | 按认知负荷与交互方式组织团队 | 不是组织架构图的别名 |
| 决策权 | Decision Rights | 谁有权批准哪类架构决策 | 不是“谁官大谁决定” |
| 团队契约 | Team Contract | 团队之间对接口、SLA、变更流程的明确约定 | 不是法律合同 |
| 架构治理 | Architecture Governance | 让决策可追踪、例外可管理的最小流程 | 不是审批流程越多越好 |
| 例外流程 | Exception Process | 允许在明确条件下偏离标准的机制 | 不是“特批” |
| 平台团队 | Platform Team | 为业务团队提供自助能力的产品团队 | 不是运维值班组 |
十组最容易混用的概念
子域与限界上下文
子域是问题空间的划分,回答“业务上有哪几块”;限界上下文是解决方案空间的边界,回答“哪一块模型必须保持一致”。一个子域可以对应多个上下文,一个上下文也可能横跨多个子域。第 3 章会用 arch-lab 的订单、库存、支付说明两者的对应关系。
聚合与模块
聚合是事务和并发的一致性边界,模块是代码和部署的组织单位。一个模块可以包含多个聚合;一个聚合也可能被多个模块读取。把聚合画成模块,通常会导致“一个大聚合管所有事”。
端口与接口
在本书里,端口特指领域需要的抽象,由外层实现;接口是 Go 语言层面的类型。端口一定是接口,但接口不一定是端口——内部的策略接口、测试替身接口都不承担隔离外层的职责。
事件与消息
事件表达“已经发生的事”,消息是传输载体。命令是“请求做一件事”,也常通过消息传输。三者可以共用一套基础设施,但语义和责任不同;第 7 章会给出对照表。
幂等与去重
幂等是效果承诺:执行多次与执行一次相同。去重是实现手段:识别并丢弃重复请求。去重窗口有限,窗口外的重复仍可能发生,所以关键操作还需要业务层的幂等设计。
最终一致与不一致
最终一致承诺“最终会收敛”,不承诺“永远不一致”。如果一个流程没有对账、没有补偿、没有收敛期限,它只是“不一致”,不是“最终一致”。
超时与重试
超时是放弃等待的边界,重试是再次发起的动作。没有超时的重试会把故障放大;没有预算的重试会让上游先崩。第 7 章和卷二会把两者放在同一条调用链上讨论。
熔断与限流
限流控制进入系统的流量,熔断控制对下游的调用。限流保护自己,熔断保护调用链。两者经常一起用,但解决的不是同一个问题。
部署单元与模块
模块是代码边界,部署单元是运行时和发布边界。模块化单体有很多模块,但只有一个部署单元;微服务通常一个模块一个部署单元,但不是必须。
架构决策与设计决策
架构决策影响多个团队、难以回退、需要跨模块协调;设计决策通常局限在一个模块内,可以由团队自行决定。不是所有决策都值得写 ADR,判断标准是“三个月后会不会有人追问为什么”。
五个容易过时的定义
有些词的定义会随行业宣传快速漂移。本书不追新口号,只保留可操作的判断。
微服务
过时定义:把应用拆成很多小服务。可操作定义:一组按业务能力组织、独立部署、独立拥有数据、通过明确契约通信的服务。判断一个系统是不是微服务,看数据所有权和发布独立性,不看容器数量。
中台
过时定义:把所有公共能力抽出来做成一个大平台。可操作定义:一组被多个业务线复用、有明确服务契约和 owner 的共享能力。没有复用方、没有契约、没有 owner 的“中台”,通常只是多了一层审批。
云原生
过时定义:上云、用 Kubernetes。可操作定义:以容器、声明式配置、可观测性和自动化发布为基础,让系统能按需伸缩和快速恢复的一组实践。用了 Kubernetes 但发布仍靠手工改配置,不算云原生。
领域驱动设计
过时定义:画很多 UML 图、写很多实体类。可操作定义:用限界上下文划分模型边界,用聚合保护业务不变式,用统一语言让业务和技术对齐。图是副产品,不是目的。
平台工程
过时定义:把运维团队改名为平台团队。可操作定义:把重复的交付、观测、安全能力做成自助产品,降低业务团队的认知负荷。判断标准是业务团队能否不排队地完成发布和排障,不是平台团队写了多少文档。
术语不是标准答案
这份表给的是本书的统一口径,不是行业标准。不同团队、不同框架、不同教材对同一个词可能有不同定义,这很正常。
重要的是三件事:
- 在一个项目里保持前后一致;
- 第一次出现时给出定义,而不是假设读者知道;
- 发现定义冲突时,先对齐“要解决什么问题”,再争论词。
如果某个词在你的团队里含义不同,不必强行改口。把差异写进 ADR 或接口文档,比背一份“正确术语表”更有用。
术语与章节对照
| 术语组 | 首次系统展开 |
|---|---|
| 质量属性、场景、ADR | 第 1–2 章 |
| 子域、限界上下文、聚合、事件风暴 | 第 3 章 |
| 模块、端口、适配器、防腐层 | 第 4 章 |
| 资源、契约、错误码、兼容性 | 第 5 章 |
| 本地事务、outbox、CQRS | 第 6 章 |
| 同步、异步、事件、命令、幂等 | 第 7 章 |
| 绞杀者、双写、适应度函数 | 第 8 章 |
| 康威定律、团队拓扑、治理 | 第 9 章 |
| 信任边界、数据分级、密钥 | 第 10 章 |
| 部署单元、故障域、有状态服务 | 第 11 章 |
常见缩写
| 缩写 | 全称 | 本书用法 |
|---|---|---|
| API | Application Programming Interface | 系统对外提供的接口,不特指 REST |
| ADR | Architecture Decision Record | 一次架构决策的记录 |
| ACL | Anti-Corruption Layer | 隔离外部模型的防腐层 |
| CQRS | Command Query Responsibility Segregation | 读写模型分离 |
| DDD | Domain-Driven Design | 领域驱动设计 |
| SLA | Service Level Agreement | 对可用性或延迟的对外承诺 |
| SLO | Service Level Objective | 内部可量化的目标 |
| RPO | Recovery Point Objective | 可接受的数据丢失时间窗口 |
| RTO | Recovery Time Objective | 可接受的恢复时间 |
| P99 | 99th Percentile | 99% 请求不超过的延迟值 |
| QPS | Queries Per Second | 每秒请求数 |
| TTL | Time To Live | 缓存或凭据的有效期 |
| REST | Representational State Transfer | 一种 HTTP API 风格,不是唯一选择 |
| SDK | Software Development Kit | 供调用方集成的客户端工具包 |
使用建议
第一,遇到不确定的词,先看它在本书里的用法,不要直接套用其他团队的语境。同一个词在不同公司可能完全相反。
第二,写 ADR 或接口文档时,第一次出现的术语给英文和一句定义。读者不需要猜。
第三,团队内部如果有不同叫法,选一个作为正式名称,其他作为别名记录,不要在代码和文档里混用。
第四,不要把这份表当成考试范围。术语的价值在于让讨论更精确,不在于背定义。
第五,发现某个词在书里前后用法不一致,按“第一次出现时的定义”理解,并把位置记下来。那通常是需要修订的地方。
小结
这份术语表覆盖了卷一会用到的六组概念:领域建模、架构风格、数据一致性、接口通信、运行可用性和组织治理。每个词给出英文、本书用法和常见混淆,并在最后列出十组最容易混用的概念。
读正文时不必先背完;遇到拿不准的词,回来查一下,再继续。术语是讨论的工具,不是讨论的目的。
同一个词在招聘启事、论文、厂商文档里的含义也可能不同,看到时先判断语境,再决定是否套用本书定义。
这份表只覆盖卷一实际出现的词,不追求收录行业全部缩写。卷二、卷三遇到新词时,会在首次出现处单独说明,不要求读者来回翻附录。
如果某个词在书中出现却没有收录,说明它更接近通用编程概念,而不是本书定义的架构术语。
表格中标注“本书用法”的条目优先于通用定义;没有标注的条目按行业通用含义理解。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。