主要观点:
- 构建 Muse 的设备同步(device-sync)时,起初有严格要求为本地优先(local-first),多数应用将数据存于服务器,而本地优先同步使世界更复杂,每个设备都有完整数据副本,需独立解决冲突。
- 构建 Muse 的同步框架时,希望支持现有功能和未来可能的功能,且不依赖同步协议的新开发,决定构建应用无关的同步协议,虽看似更复杂但能简化问题。
- 冲突时无服务器调解,各设备需自行解决,采用最后写入者获胜(last-write-wins)方法,用混合逻辑时钟确定事件顺序,考虑过向量时钟但最终选择混合逻辑时钟,还对比了操作转换(Operational Transforms)。
- 为确定最近写入获胜,定义了原子变化(Atomic Changes),包括对象 ID、属性、值、时钟、设备 ID 等,还引入了作用域(Scope)概念,方便数据共享与协作。
- Muse 基于 CoreData 构建,通过 Swift 的属性包装器(property wrappers)实现同步引擎,不同 Swift 类型可组成或分解为原子变化,方便定义可在设备间原子同步的任意数据结构。
- 有了灵活强大的本地优先同步框架,可构建复杂应用特定数据类型,Swift 属性包装器隐藏了底层同步实现,虽未描述原子变化的实际同步路径,但已定义了需同步的内容。
关键信息:
- 本地优先同步的特点及与传统方式的区别。
- 构建同步框架的目标及选择应用无关协议的原因。
- 最后写入者获胜方法及相关时钟选择。
- 原子变化的定义及作用域概念。
- Muse 基于 CoreData 和 Swift 属性包装器实现同步。
- 本地优先同步框架的灵活性及未描述的同步路径。
重要细节:
- 混合逻辑时钟由设备的墙钟、计数器和设备 ID 组成。
- 原子变化的数据库表结构及各字段含义。
- Swift 中不同类型如 CGPoint、CGSize、CGRect 与原子变化的关系及编码方式。
- 通过搜索 Sqlite 按特定条件加载对象的过程。
- Muse 正在招聘本地优先工程师。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。