《后端架构设计》是一套四卷本:卷一《架构基础与边界》、卷二《高性能与高可用》、卷三《分布式与数据一致性》、卷四《演进与治理》。本页是卷三的完整目录,共 45 篇。
卷二把单机边界内的性能、过载和故障处理完了,但它留下一个更硬的问题:当订单、库存、支付不再共享同一个数据库、同一个时钟、同一次事务,系统靠什么保证“不会超卖、不会重复扣款、不会丢单”?卷三回答的就是这个问题。它不把 CAP 再讲一遍,而是把每个结论落到 arch-lab 的一个组件、一次故障注入或一张带退出条件的决策表上。
全书概览
| 项目 | 内容 |
|---|---|
| 书稿 | 《后端架构设计·分布式与数据一致性》 |
| 篇数 | 45 篇(13 章 × 3 节 + 序、前言、目录、附录 A–C) |
| 主线项目 | arch-lab:Go 1.26 订单交易系统 |
| 技术栈 | Go 1.26.0 主线;Java 21 结构对照 |
| 运行级别 | L1 为主;第 7、8、13 章至少各一个 L2 进程内场景;L3/L4 只讨论,不承诺实跑 |
| 阅读方式 | 从目录与学习路径 进入顺序通读,或按下方路径跳读 |
| 上级专题 | 书稿专题 |
| 相关专题 | 分布式系统 · 架构设计 |
三条阅读路径
路径 A:顺序通读(约 38 小时)
按 13 章顺序读。第 1–2 章建立部分失败、故障模型、时钟与因果的基本判断;第 3–5 章进入复制、共识和分片;第 6 章把一致性模型翻译成业务不变量;第 7–9 章处理事务、可靠消息、幂等与对账;第 10–12 章讨论 ID、锁、调度和多活;第 13 章完成跨分片下单的端到端验证。
路径 B:跨库改造驱动(约 12 小时)
手上正有一次分库分表或跨服务事务改造时,按这个顺序读:1.1 → 1.2 → 5.1 → 6.3 → 7.2 → 8.1 → 8.2 → 9.2 → 13.1 → 13.2。先确认失败模型和分片键,再选事务与消息方案,最后用对账和不变量验收。
路径 C:线上一致性问题驱动(约 6 小时)
遇到超卖、重复扣款、订单状态倒退、切换丢单时,先查症状表,再读对应章节:超卖读 6.3 和 10.2,重复扣款读 8.2 和 9.1,状态倒退读 2.1 和 3.3,切换丢单读 3.3 和 12.3,消息重复读 8.2 和 8.3,锁失效读 10.2 和 10.3。
全书目录
前置与附录
| 篇 | 文章 | 核心内容 |
|---|---|---|
| 序 | 序 | 三个一致性事故、卷二留下的假设、四个立场与四卷分工 |
| 前言 | 前言 | 卷三新增组件、L1–L4、代码标记、S1/S2/S3 场景与数字口径 |
| 目录 | 目录与学习路径 | 13 章依赖图、三条路径、症状表、章节速览与读完标准 |
| 附 A | 附录 A 一致性模型与故障语义速查 | 一致性强弱、故障语义、CAP 误读与不变量映射 |
| 附 B | 附录 B Go/Java 分布式组件对照 | 虚拟线程、并发容器、时钟、锁与重试生态的结构差异 |
| 附 C | 附录 C 分布式一致性验证清单 | 六类场景的注入、观测、判定与回滚,上线前二十条检查 |
第一部分:基础与模型(第 1–2 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 1.1 | 从单机到分布式:哪些问题真的变了 | 部分失败、网络延迟、并发与无共享时钟;双节点模拟器 |
| 1.2 | 故障模型:崩溃、丢包、分区与拜占庭 | 可注入的确定性网络与故障分类,为什么默认崩溃-恢复 |
| 1.3 | 远程调用的八个假设与端到端原则 | 假设逐条拆解、重试放大实验与端到端可靠性 |
| 2.1 | 物理时钟、NTP 与时钟漂移的可见后果 | 墙上时钟与单调时钟、回拨与最后写入获胜的丢数据 |
| 2.2 | 逻辑时钟与向量时钟:因果关系怎么编码 | Lamport 时钟、向量时钟、并发检测与合并 |
| 2.3 | 混合逻辑时钟与版本向量在 arch-lab 的落地 | HLC 实现、订单事件的版本向量与并发修改检测 |
第二部分:复制、共识与分片(第 3–5 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 3.1 | 单主复制:复制日志、位点与读己之写 | 复制日志、提交/应用位点、会话令牌与读己之写 |
| 3.2 | 多主与无主复制:冲突检测与合并 | 多主冲突、CRDT 合并与 R+W>N 的读写重叠 |
| 3.3 | 复制延迟、故障切换与数据丢失窗口 | 异步复制滞后、未复制尾部与 RPO 计算 |
| 4.1 | 共识问题与 Raft 的角色、任期、日志 | 安全性与活性、三种角色、任期与日志匹配 |
| 4.2 | 选主、日志复制与提交规则的可运行实现 | 确定性消息传递的迷你 Raft 与分区测试 |
| 4.3 | 成员变更、快照与线性一致读 | 成员变更、日志压缩、ReadIndex 与安全边界 |
| 5.1 | 分片键、热点与一致性哈希 | 分片键约束、虚拟节点、热点与迁移比例 |
| 5.2 | 再平衡:迁移、双写与客户端路由 | 迁移状态机、双写双读、路由版本与回滚 |
| 5.3 | 请求路由、元数据与扩容期间的错误预算 | 元数据传播、陈旧路由与扩容窗口的错误预算 |
第三部分:一致性与事务(第 6–7 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 6.1 | 线性一致、顺序一致与因果一致 | 三种模型的形式定义与历史记录检查器 |
| 6.2 | 会话保证:读己之写、单调读与一致前缀 | 会话令牌、版本水位与粘性路由 |
| 6.3 | 从一致性模型到业务不变量 | 不超卖、状态单向、不重复扣款与最弱模型 |
| 7.1 | 2PC 与 3PC:准备、提交与协调者故障 | 两阶段提交、参与者日志、阻塞与恢复 |
| 7.2 | Saga:补偿、语义锁与不可补偿步骤 | 编排式 Saga、补偿顺序、语义锁与步骤前移 |
| 7.3 | TCC、本地消息表与事务状态的可见性 | 空回滚、悬挂、幂等与中间态查询 |
第四部分:可靠交付与对账(第 8–9 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 8.1 | 事务性 Outbox:同库写入与投递保证 | 同库同事务、relay 位点与提交后崩溃 |
| 8.2 | 消费端幂等、去重表与恰好一次的真实边界 | 去重键、写入时机与 effect-once |
| 8.3 | 消息顺序、重放与死信的对账闭环 | 分区内顺序、重放位点、死信分类与对账收敛 |
| 9.1 | 幂等键设计:作用域、生命周期与存储 | 键作用域、生成责任、TTL 与并发同键 |
| 9.2 | 对账系统:T+1、实时与差异分类 | 全量与流式对账、差异分类与处置 |
| 9.3 | 冲正、补偿与资金类操作的最终一致 | 幂等冲正、部分成功、悬挂与不变量 |
第五部分:协调与容灾(第 10–12 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 10.1 | 分布式 ID:Snowflake、号段与时钟回拨 | 位分配、号段双缓冲与回拨处理 |
| 10.2 | 分布式锁:租约、fencing token 与 Redis 边界 | 租约续约、fencing token 与主从切换边界 |
| 10.3 | 锁失效后的正确性:从互斥到幂等 | 版本号、条件更新与锁失效时仍成立的不变量 |
| 11.1 | 调度模型:轮询、租约与领导者选举 | 三种归属方式、重复触发与恢复时间 |
| 11.2 | 任务分片、幂等重跑与进度检查点 | 分片键、检查点与崩溃续跑 |
| 11.3 | 延迟任务、时间轮与错过触发的补偿 | 时间轮、持久化延迟任务与 misfire 补偿 |
| 12.1 | 多活拓扑:单元化、双活与就近接入 | 单元化边界、路由、数据归属与影响范围 |
| 12.2 | 数据同步与冲突:双向复制、回环与归属 | 回环检测、版本向量与归属单元 |
| 12.3 | 容灾切换:RTO/RPO、演练与回切 | RTO/RPO 测算、切换决策与回切顺序 |
第六部分:综合实验(第 13 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 13.1 | 订单系统的分布式改造:从单库到分片 | 按用户分片、跨分片查询、全局 ID 与迁移双写 |
| 13.2 | 一次跨库下单的一致性验证 | outbox + Saga、故障注入与不变量/对账收敛 |
| 13.3 | 进入卷四:演进与治理 | 未证明假设、治理成本与交给卷四的问题清单 |
与站内专题的关系
卷三与 分布式系统 专题是“书稿 + 专题”的关系,不是替代关系。专题文章负责概念地图和历史脉络,卷三负责订单系统里的可运行实现与故障判定。例如:
- 复制与共识:一致性模型 与 Raft 实现 提供背景,卷三第 3–4 章给出可测试的日志、选主和提交规则。
- 事务与消息:分布式事务 与 消息队列 提供选型,卷三第 7–8 章给出 Saga、TCC、outbox 的失败窗口。
- 分片与协调:一致性哈希 与 分布式锁 提供算法,卷三第 5、10 章给出迁移、fencing token 与锁失效后的正确性。
- 多活与容灾:多活架构 与 多站点容灾 提供拓扑,卷三第 12 章给出切换顺序与演练验收。
arch-lab 在卷三新增什么
卷三不重画领域边界,只在 internal/platform/ 下增加分布式能力:
| 组 | 新增组件 | 对应章节 |
|---|---|---|
| 时间与因果 | 物理/逻辑/混合时钟、版本向量 | 第 2 章 |
| 复制与共识 | 复制日志、仲裁读写、迷你 Raft | 第 3–4 章 |
| 分片与路由 | 一致性哈希、迁移状态机、路由表 | 第 5 章 |
| 事务与交付 | 2PC、Saga、TCC、outbox/inbox | 第 7–8 章 |
| 幂等与对账 | 幂等键、去重表、差异分类 | 第 9 章 |
| 协调 | Snowflake/号段、租约锁、调度器 | 第 10–11 章 |
| 多活 | 单元路由、双向复制、切换状态机 | 第 12 章 |
这些组件仍然通过端口接入领域层;Order 聚合不知道复制、消息和锁的存在。代码分 L1–L4 四级,卷三以 L1 为主,第 7、8、13 章各有一个 L2 进程内端到端场景;L3/L4 只写清需要什么真实环境,不伪造多节点实测。
读完标准
读完卷三,你应该能独立回答下面六个问题:
- 给定一次跨库下单,失败可能发生在哪些点,每个点的可见状态是什么?
- 为什么“加锁”不能替代幂等?锁过期后靠什么保证不变量?
- 单主异步复制切主时,最多会丢多少数据?这个窗口怎么算、怎么缩?
- Raft 的选举安全性和日志匹配分别排除了哪种错误?
- 分片迁移期间,读请求应该走旧路由、新路由还是双读?什么时候可以切干净?
- 对账发现差异后,哪些能自动修复,哪些必须人工,修复本身如何幂等?
如果只能背出 CAP、BASE、2PC 的定义,却回答不了这六个问题,说明还停留在名词层。卷三的每篇都要求至少一个可运行片段或一张带判据的表,就是为了把回答逼到可验证的层面。
版本与验证
- Go 1.26.0(darwin/arm64)用于全部 Go 代码与测试。
- Java 对照使用 JDK 21 语法;未在本机实跑的 Java 片段会明确标注“示例代码”。
- 代码块用
// file:、// tier:、// verify:标记,可抽取后独立编译测试。 - 本卷不承诺生产级 Raft、真实网络分区或跨机房实测;相关结论以“需真实环境”标注。
- 章节日期集中在 2026-10-25 至 2026-11-02,均早于站点构建的当前时间,避免未来页面被跳过。
卷三结束后,卷四《演进与治理》接手:微服务拆分、通信与契约演进、服务发现、网关与 BFF、配置与开关、可观测性、SLO 与错误预算、混沌演练、发布工程、多租户、平台工程与成本治理。