《同步的工作方式》一文讲的是你能看到的部分。这一篇再深入一层,讲讲每台设备和服务器实际上如何处理你的改动。
每个改动都会变成一项操作
当你编辑一条笔记时,你的设备会一步完成两件事:把新文本保存到本地数据库,并往队列里添加一项操作,也就是一条小记录,内容是"这条笔记改了,这是新版本"。创建、编辑、置顶、打标签、归档和删除笔记,都是操作。
在发送队列之前,你的设备会先整理它。对同一条笔记的十次快速编辑会合并成一次。如果你在输入的同时置顶了这条笔记,置顶和新文本会合并成一项操作,两边的改动都不会丢失。只有队列的顺序才算数:较晚的改动总是胜过较早的改动,无论设备上的时钟怎么说。
一项操作只有在服务器确认后才会离开队列。如果连接中途断开,或者你在同步途中关闭了应用,队列下次依然还在,什么都不会丢失。
先推送,再拉取
同步就是和服务器之间的两段简单对话:
- 推送。 你的设备分批发送队列中的操作。服务器逐一应用,并把每一项写入你账户的变更日志,按顺序为每条记录分配下一个编号。
- 拉取。 你的设备询问:"1,234 号之后有什么变化?"服务器会返回这个编号之后的每一条日志记录,设备再把它们应用到本地数据库。
因为每台设备都记得自己见过的最后一个编号,所以它只下载新的内容。一台设备离线多久都没关系:它会从上次停下的地方准确地接上。
所有改动你笔记的操作都会经过这份日志,包括通过 API 或通过 MCP 接入的 AI 工具所做的改动。这就是为什么 AI 助手为你写的笔记,会像其他笔记一样出现在你所有的设备上。
如何发现冲突
你的设备发出的每一次编辑,都附带着它见过的这条笔记的最后一个版本。如果服务器上的副本在那之后发生了变化(因为另一台设备在此期间编辑了它),服务器不会覆盖任何内容,而是返回它自己的副本。
接着,你的设备会尝试三方合并,这是版本控制工具所使用的技术。它比较三段文本:两台设备共同的起点版本、你的版本,以及服务器的版本。如果两边的编辑涉及笔记的不同部分,它会把它们合并起来并发送合并结果,你根本不会察觉。只有当两台设备改动了相同的行时,Caliu 才会询问你要保留哪个版本。请看《解决同步冲突》一文。
有些改动永远不会冲突。置顶、归档和把笔记设为只读,都不算对文本的编辑,因此可以与任何改动干净地合并。
每台设备遵循相同的规则
网页应用、Apple 应用和 Android 应用分别用三种不同的编程语言编写,但它们遵循同一套同步规则。整理队列的规则在三者上都对照同一套共享测试用例进行检验,因此在一台设备上做出的改动,其他每台设备都会以相同的方式处理。
没有账户时
没有账户时,任何内容都不会离开你的设备。登录后,设备上已有的笔记会加入你的账户,并像其他改动一样上传。