I3.10.1local-first authoritative replica设计

本地优先架构把本地存储作为权威副本,网络同步是补充而非前提

别名: 本地优先 · local-first · 权威副本 · CRDT 本地

概念解释

打开文档、写下字、打上勾,这些动作的权威结果写在这台设备的存储里。云端是稍后要对齐的另一份副本,不是「先问过它才算数」。这种结构叫本地优先(local-first):本地存储是权威副本(authoritative replica),网络同步是补充。没有网,权威仍然在;有网,权威把变更送给别人的权威。

它和「离线时把请求排进队列、上线后再提交给服务器当权威」不是同一件事。队列模型里,本地只是出站缓冲区,服务器才是真。本地优先里,磁盘上的那份在冲突解决之前就是真,同步失败不能把已经写下的字作废。

机制

以服务器为权威时,每一次写入的因果链是「请求 → 许可 → 本地可显示」。网络是链上的必需边,断边则整条链停。本地优先把因果链改成「意图 → 本地提交 → (有空时)与其他副本交换」。提交的那一拍不经过无线电,所以即时因果和跨会话保留是同一层存储,不是两套权宜。

副本之间用交换而不是用请示来收敛。交换可以是 CRDT、操作日志加合并、或同步协议。关键不在算法名,在谁有权说「已经写下」:是本地的提交记录,还是远端的 200。把 200 当提交,离线写作在哲学上就不存在,只能伪装成待发送。把本地提交当提交,云端掉线是同步延迟,不是保存失败。

边界

钱、身份、唯一库存这类必须有一个全球仲裁者的对象,不能把每台手机都当成权威;本地优先停在「草稿与个人工作区」,支付仍走中心权威。被监管的数据可能被禁止只存在设备上。只读分发(杂志、课程包)没有本地权威可写,谈不上这条。多设备同一账号若各当权威却没有交换,会分裂成几份互相不认的真——本地优先包含同步补充,不是「永不联网」。浏览器的易失存储(被系统随时清掉的临时分区)担不起权威之名,权威要落在用户能理解「这就是文件」的位置。

怎么落地

  • 把「保存成功」绑定到本地提交完成,而不是绑定到同步圆点变绿。同步是另一盏灯。
  • 同步失败时已写下的内容仍在、仍可继续改,错误文案是「还没同步给其他设备」,不是「保存失败」。
  • 选择能在无网时完成提交的存储(本机数据库、用户可见的文件),不要把权威放在必须先握手的会话里。
  • 验证:断网写一段,杀应用,再打开。字还在,且没有「未保存」。恢复网络后才出现同步过程。对照:同一产品若断网时只能进「待发送」且杀进程后待发送蒸发,那是队列缓冲,不是权威副本。

延伸

  • 同组I3.10.2 本地优先能让核心操作在完全无网络时依然可用而不仅是可查看 · I3.10.3 本地与云端的最终一致性需要用户能理解的收敛过程而非黑箱 · I3.10.4 长期离线积累的本地变更在重新联网时可能引发大规模冲突
  • 相邻I3.03 离线状态 · I3.06 状态持久化
  • 站内检索local-first · authoritative replica · CRDT

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/I3.10.1