揭开黑盒 / 第一章 / 第四单元
现代系统,
怎样走到今天?
沿着一个不断变大的任务,看旧办法在哪里不够、新机制改变了什么、谁接下新的代价。点开每个节点阅读原因;橙色文字解释“为什么走向下一步”。
这是一张历史与设计路线图。日期是选定论文或规范的发表节点;箭头表示问题推动,不能当作所有产品的单线升级顺序。前三单元的源码是可核查的起点,图中现代系统没有被本课程逐一部署。
从数据在哪里,到多台机器如何共同承诺
保存:查询、事务,再到分布式选择
起点 · 文件与早期数据库程序掌握记录的组织和访问路线
能做:按已知格式保存、查找和连接记录。
压力:数据布局与查询需求改变,会牵动依赖这些路径的程序。
↓ 希望查询能独立于物理访问路径
1970 关系模型 · 后续 SQL 与关系数据库实践声明需要什么,把访问安排交给系统
变化:根据逻辑关系表达查询,由数据库选择执行计划。
代价:布局、索引与优化被移到数据库内部;文件与专用存储仍有用途。
↓ 多人同时修改,还会在中间出故障
长期并行发展 · 事务、并发控制与恢复把几次读写组织成有边界的提交
变化:锁、版本与恢复日志承担不同职责,成功确认要放在明确条件之后。
代价:等待、日志写入、版本保留与恢复工作。
回到教材:Store.save 借助 SQLite 事务,自己维护操作编号和异文冲突;没有实现跨机器事务。
↓ 单机失效;容量或吞吐超过一台机器
复制与分片同一份数据放多处,不同数据分开处理
变化:复制处理副本与可用性,分片扩展容量与工作分配。
代价:副本延迟、故障切换、跨分片操作与网络协调。
2006 Bigtable / 2007 Dynamo · 两种代表按规模和可用性重新划定接口
Bigtable 面向海量结构化数据与布局;Dynamo 在一些故障条件下允许版本分歧,再由应用参与合并。二者本身也有不同目标,不能统称为同一种保证。
要接下:特定数据模型、查询边界或合并责任。
2012 Spanner · 另一条代表路线跨地域仍追求明确的事务语义
把同步复制、分布式事务与时间不确定性处理结合起来。
要接下:协调等待、基础设施及保证得以成立的可用条件。
今天常将本地数据库、关系服务、对象存储、缓存和队列组合起来。选择从用途出发;“副本更多”不会自动变成备份或业务恰好一次。
从服务器给出画面,到客户端承担状态与协作
状态:局部更新之后,更多责任来到本地
早期 Web 的典型方式 · 至今仍在使用请求、整页响应、再提交
能做:把一次读取组织成完整页面,边界直观。
压力:用户只改一个地方,却要重新等待;其他交互状态也需要保留。
↓ 想让局部动作立即改变局部画面
2000 年代浏览器应用发展 · Ajax 等路线后台取数据,浏览器自己更新画面
变化:画面、数据获取与本地状态开始分离。
代价:响应乱序、对象范围、渲染规则和多个状态副本。
回到教材:capture → deliver → renderSummary 把这些环节拆开观察。
分支 A · 变化要更及时轮询 → 长轮询 / 持续事件通道
2011 年 WebSocket 规范为浏览器双向通信提供共同框架;SSE 面向服务到浏览器的事件流。选择取决于方向与用途。
仍要处理:断线补齐、重复、快照与事件之间的边界。
分支 B · 等网络太慢,断线也要继续乐观更新 → 本地副本与同步
先保留本地意图与待确认状态,离线修改在恢复连接后继续推进。
仍要处理:拒绝、过期依据、不同设备上的并发修改。
↓ 同步两份内容,不能自动决定怎样合并两个人的意图
协作研究长期推进 · 2019 local-first 论文作为设计节点把操作、身份与合并规则写进状态
特定 OT/CRDT 支持其模型内的协作;local-first 将离线、协作、长期访问与用户控制联系起来。
代价:额外元数据、算法前提与业务约束。计数器能合并,不代表库存约束也已解决。
回到教材:planImport / applyImport 是显式比较和人工冲突处理,尚非实时协作算法。
从跨网络交付,到让不同交互更独立地推进
通信:上层拆开之后,下一层还会让谁等?
分组交换与互联研究 → 1981 IP/TCP 规范节点把跨网络交付与端到端传输分开
IP 处理数据报互联;TCP 维护有序字节流。应用仍须规定自己的消息边界。
回到教材:pack / unpack / Decoder.feed 管理长度帧;模拟通道的分块不是实际 TCP 包。
↓ 网页资源增多,反复建立连接很昂贵
1997 · HTTP/1.1 初版规范多次请求复用连接
减少重复建连;流水线等安排仍受响应顺序和实际支持条件限制。
新的压力:同一连接里,慢响应可能拖住其他交互。
↓ 希望一条连接里同时推进多个交互
2015 · HTTP/2 规范节点帧与流多路复用
不同交互可以交错传送,HTTP 语义继续沿用。
剩余限制:下方 TCP 字节流的一处缺口,仍可能阻挡多个流的后续字节交付。
↓ 需要传输层本身认识独立流,并更好支持移动网络
2021 QUIC v1 → 2022 HTTP/3在 UDP 上组织安全传输与独立流
QUIC 提供可靠流、恢复、拥塞与流量控制等机制,并支持有条件的路径迁移;HTTP/3 将 HTTP 映射到它。
仍然共享:带宽、拥塞与应用依赖。改进某种阻塞,不等于所有等待都消失。
相交路线 · TLS 系列;2018 TLS 1.3 节点在能传送之外,提供认证与保护
机密性、完整性与对端认证有自己的协议;它们也不代替业务账户权限。安全与传输协同演进。
长期并行的应用架构路线 · 消息中间件与队列把生产和消费在时间上分开
代理接受、消费者处理、业务提交是不同确认;持久化、积压与重投都需要协议。它不是 HTTP/3 的下一代。
走到今天,传输确认、代理确认与业务提交仍有不同边界。现代机制通过明确条件提供更有用的保证,没有消除第一章调查过的不确定性。