读过概念之后,用一个具体请求或故障验证自己能否讲清。本表按 DDIA 第一版的 12 章编排,与本站章节笔记一致;其他版次的章节编号可能不同。问题由本站整理,用于练习,不代表作者原题或某家公司的面试题库。
12 章对照:从概念到可推演的问题
| 章节 | 需要掌握 | 练习问题 | 应用入口 |
|---|---|---|---|
| 1. 可靠性、可扩展性、可维护性 | 把宽泛目标转成负载假设与可衡量的服务行为。 | 流量增长 10 倍,哪里先失效?用什么指标判断? | 容量估算器 |
| 2. 数据模型与查询语言 | 根据访问模式、关系与更新边界选择模型。 | 如何建模帖子、关注关系和信息流读取? | 信息流 |
| 3. 存储与检索 | 将索引、写放大与读取成本对应到实际负载。 | 键值存储的主要操作是什么?索引会增加哪些成本? | 键值存储 |
| 4. 编码与演化 | 规划存量数据与新旧软件版本之间的 schema 兼容。 | 生产者增加字段时,怎样避免所有消费者同步发布? | Kafka 与事件消费者 |
| 5. 复制 | 明确一致性保证,推演复制延迟或主节点切换。 | 用户更新后从哪里读取,才能避免立即看到旧值? | 键值存储的副本 |
| 6. 分区 | 选择分区键、路由请求,并处理倾斜与重平衡。 | 持续读写时,如何迁移热点分片? | 分片专题 |
| 7. 事务 | 把隔离级别对应到业务不变量和具体并发时序。 | 两位用户争抢最后一间房,由哪个操作决定成功者? | 并发预订演示 |
| 8. 分布式系统的麻烦 | 将超时视为结果未知,考虑进程暂停、时钟与局部故障。 | 扣款调用超时后,怎样确认实际是否发生了扣款? | 支付系统 |
| 9. 一致性与共识 | 区分线性一致性、有序与达成共识。 | 故障切换时哪些信息必须达成一致,哪些读取允许陈旧? | 键值存储的故障切换 |
| 10. 批处理 | 通过明确输入与输出来保证大规模计算可重现。 | 如何重建派生视图,又不影响线上请求? | 爬虫与索引流水线 |
| 11. 流处理 | 解释事件时间、重放、状态及处理保证的边界。 | 消费者触发外部副作用后、保存 offset 前崩溃,会发生什么? | Kafka 与重放 |
| 12. 数据系统的未来 | 连接派生数据、端到端正确性、可审计性与责任边界。 | 哪些记录能证明结账完成?系统间不一致时如何修复? | 电商结账 |
按薄弱点选择学习路径
先补正确性
推演并发预订、未知支付结果和故障切换,先说不变量,再选机制。 打开配套练习 →
补存储与扩展
先选择数据模型和索引,再加入复制与分区,找出热点键和陈旧读取。 打开配套练习 →
补演化与派生数据
第 4 章 → 第 10 章 → 第 11 章 → 第 12 章
修改事件 schema 并重建派生视图,解释重放、迟到事件、外部副作用与审计记录。 打开配套练习 →
示例:支付成功回调晚于库存预留期限
先定规则:假设预留 10 秒到期,只有到期前完成确认才能把预订改成 BOOKED。支付回调可能延迟或重复,过期任务也可能晚运行。
- 第 7 章:原子边界。在同一事务中检查预订状态与期限,并完成状态转换和库存变更。重复操作不能再次释放库存。
- 第 8 章:未知结果。扣款请求超时不等于失败。先用稳定的支付身份查询或按支付方幂等契约重试,不能直接创建第二笔付款。
- 第 11 章:重复与恢复。到期后收到支付成功时,持久化一次退款意图。消费者可以重试,但退款调用使用稳定键;任务入队不等于退款完成。
这个回答把规则、并发和恢复连接起来。若产品选择按支付方扣款时间决定有效性,就需要另一套时钟、证据与补偿规则,不能只把比较符号改掉。
每章读完后的三问
- 我需要保护什么不变量,允许哪些陈旧或失败?
- 能否用两个请求和一次故障,逐步说明状态如何变化?
- 选定机制后增加了什么延迟、存储、运维或恢复成本?
书籍与版本信息:Designing Data-Intensive Applications。本表是本站学习辅助资料,不替代原书。