posts

《后端架构设计·分布式与数据一致性》 · 全书目录与章节索引(45 篇)

《后端架构设计》卷三全 45 篇:以 Go 订单系统 arch-lab 为主线,从部分失败、时钟与因果讲到复制、共识、分片、一致性模型、分布式事务、outbox、幂等对账、ID 与锁、调度和多活容灾,最后完成一次跨分片下单的一致性验证与可运行测试。

《后端架构设计》是一套四卷本:卷一《架构基础与边界》、卷二《高性能与高可用》、卷三《分布式与数据一致性》、卷四《演进与治理》。本页是卷三的完整目录,共 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.12PC 与 3PC:准备、提交与协调者故障两阶段提交、参与者日志、阻塞与恢复
7.2Saga:补偿、语义锁与不可补偿步骤编排式 Saga、补偿顺序、语义锁与步骤前移
7.3TCC、本地消息表与事务状态的可见性空回滚、悬挂、幂等与中间态查询

第四部分:可靠交付与对账(第 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进入卷四:演进与治理未证明假设、治理成本与交给卷四的问题清单

与站内专题的关系

卷三与 分布式系统 专题是“书稿 + 专题”的关系,不是替代关系。专题文章负责概念地图和历史脉络,卷三负责订单系统里的可运行实现与故障判定。例如:

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 只写清需要什么真实环境,不伪造多节点实测。

读完标准

读完卷三,你应该能独立回答下面六个问题:

  1. 给定一次跨库下单,失败可能发生在哪些点,每个点的可见状态是什么?
  2. 为什么“加锁”不能替代幂等?锁过期后靠什么保证不变量?
  3. 单主异步复制切主时,最多会丢多少数据?这个窗口怎么算、怎么缩?
  4. Raft 的选举安全性和日志匹配分别排除了哪种错误?
  5. 分片迁移期间,读请求应该走旧路由、新路由还是双读?什么时候可以切干净?
  6. 对账发现差异后,哪些能自动修复,哪些必须人工,修复本身如何幂等?

如果只能背出 CAP、BASE、2PC 的定义,却回答不了这六个问题,说明还停留在名词层。卷三的每篇都要求至少一个可运行片段或一张带判据的表,就是为了把回答逼到可验证的层面。

版本与验证

卷三结束后,卷四《演进与治理》接手:微服务拆分、通信与契约演进、服务发现、网关与 BFF、配置与开关、可观测性、SLO 与错误预算、混沌演练、发布工程、多租户、平台工程与成本治理。

全部文章 Books game Java Indie golang 客户端开发 Minigame Saas rust Python
books

《后端架构设计·分布式与数据一致性》7.3 TCC、本地消息表与事务状态的可见性

支付回调超时后,Cancel 可能先于 Try 到达,造成空回滚;迟到的 Try 又可能永久占住库存,形成悬挂。本文用订单预占场景实现带墓碑与状态机的 TCC,并用同库本地消息表让 TRYING、CONFIRMED、CANCELLED 对下游可见,给出空回滚、悬挂、幂等与中间态查询的可运行测试。

9 分钟阅读
书稿 后端架构 Go
books

《后端架构设计·分布式与数据一致性》7.2 Saga:补偿、语义锁与不可补偿步骤

订单 Saga 失败时,“把前面的步骤反向调用一遍”看似简单,实际补偿是新业务动作,可能失败、可能不幂等,也挡不住并发请求读到中间态。本文用库存预留、支付扣款与发券场景,给出带语义锁、逆序补偿和不可补偿步骤校验的可运行 Go 实现,并列出把不可逆动作前移或改为可重试的判据。

10 分钟阅读
书稿 后端架构 Go
books

《后端架构设计·分布式与数据一致性》7.1 2PC 与 3PC:准备、提交与协调者故障

订单与库存、支付分库后,两阶段提交常被当成“分布式事务的标准答案”。本文用一次下单说明它真正保证的是原子提交而不是不阻塞,给出参与者日志、协调者决策日志与崩溃恢复的可运行 Go 实现,复现 in-doubt 窗口,并用判据表比较 2PC、3PC 与补偿型方案。

9 分钟阅读
书稿 后端架构 Go
books

《后端架构设计·分布式与数据一致性》6.2 会话保证:读己之写、单调读与一致前缀

从下单成功却在订单列表看不到新订单的场景出发,实现基于全局版本水位与副本 applied 位点的会话层,逐项测试读己之写、单调读、单调写与一致前缀,并说明粘性路由为何只是优化而不是保证,附订单读路径的选型表,可直接对照本节的测试用例落地与排障。

9 分钟阅读
书稿 后端架构 Go
books

《后端架构设计·分布式与数据一致性》6.1 线性一致、顺序一致与因果一致

用支付成功后订单状态又被读回旧值的场景,区分线性一致、顺序一致与因果一致的形式判据;实现可回溯的历史检查器,用三类历史分别判定线性一致违例、顺序一致但非线性的执行,以及跳过因果上更晚写入的读,并给出订单链路的模型选型表,帮助在支付强一致与展示弱一致之间做取舍。

10 分钟阅读
书稿 后端架构 Go
books

《后端架构设计·分布式与数据一致性》5.3 请求路由、元数据与扩容期间的错误预算

从扩容时客户端仍按旧元数据把订单写进旧分片的具体故障出发,说明路由版本传播、陈旧路由失效与重试收敛,给出带版本保护和权威解析的 Go 路由实现,并用 1000 万请求窗口实测错误预算、解析失败率与熔断阈值之间的数量关系,附可复现测试输出与扩容决策表。

9 分钟阅读
书稿 后端架构 Go
books

《后端架构设计·分布式与数据一致性》5.2 再平衡:迁移、双写与客户端路由

从订单迁移时“先停写再搬数据”的错误直觉出发,把再平衡拆成快照、双写、回填、校验、切换五个阶段,给出可重入的 Go 迁移状态机与版本条件写入,并用 100 个订单键实测迁移中断后的续跑、双写不丢更新、回填未完成时拒绝切换,以及回滚后写回源分片的完整路径,附原始测试输出与阶段判据。

8 分钟阅读
书稿 后端架构 Go
books

《后端架构设计·分布式与数据一致性》3.3 复制延迟、故障切换与数据丢失窗口

从支付回调成功后主库宕机、切换后备库缺少最后一笔订单的场景,拆解复制滞后、提交位点与故障切换的关系;用可运行的 Go 模型计算未复制尾部如何变成 RPO,比较异步与半同步的确认集合,并给出切换前的位点检查清单,说明半同步确认集合与提升候选不一致时为何仍会丢数据。

7 分钟阅读
书稿 后端架构 Go
books

《后端架构设计·分布式与数据一致性》3.1 单主复制:复制日志、位点与读己之写

从大促中“支付成功却显示待支付”的订单详情页切入,区分复制日志的写入、提交与应用三种位点,说明强制读主和固定 sleep 为什么都不可靠;用可运行的 Go 单主复制包实现会话令牌与读己之写,并测试主库切换后未提交尾部被丢弃、位点不足时必须显式报错。

7 分钟阅读
书稿 后端架构 Go
books

《后端架构设计·分布式与数据一致性》2.1 物理时钟、NTP 与时钟漂移的可见后果

订单支付完成 0.5 秒后用户取消,取消时间戳却早了 2.5 秒,合并结果仍是 PAID:本文用可运行的 SimulatedClock、NTP 偏移计算和 LWW 寄存器复现这次丢更新,解释墙上时钟与单调时钟的分工、非对称链路对偏移估计的偏差,并给出哪些场景绝不能用时间戳排序的判据表。

7 分钟阅读
书稿 后端架构 Go
books

《后端架构设计·分布式与数据一致性》1.3 远程调用的八个假设与端到端原则

网络可靠、延迟为零、带宽无限等八个假设,在订单链路上会以重试放大、重复扣款和超时误判的形式出现。本文用可运行的 Go 重试模拟器测出三层各重试三次会把一次调用放大成 64 次,并说明为什么端到端可靠性必须由调用方与服务端的幂等共同保证,而不能交给中间链路。

8 分钟阅读
书稿 后端架构 Go