ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Mindwtr如何实现多端无损同步?完整拆解它的合并算法、墓碑机制与冲突解决策略

Mindwtr如何实现多端无损同步?完整拆解它的合并算法、墓碑机制与冲突解决策略 Mindwtr如何实现多端无损同步完整拆解它的合并算法、墓碑机制与冲突解决策略【免费下载链接】MindwtrGet tasks and ideas out of your head. A free GTD to-do app for desktop and mobile. Works offline, no account needed项目地址: https://gitcode.com/gh_mirrors/mi/MindwtrMindwtr是一款免费、开源、本地优先的 GTD 待办事项应用To-Do App支持桌面端和移动端离线使用、无需注册账号。它最核心的能力之一就是多端无损同步你在手机上改的任务打开电脑就能看到而多台设备同时修改同一条任务时Mindwtr 依靠一套版本感知的合并算法revision-aware merge、墓碑机制Tombstone和确定性的冲突解决规则保证所有设备最终收敛到完全一致的结果且不丢失任何一方的有效修改。为什么简单的最后写入 wins不够用很多人的第一反应是两台设备改了同一条任务谁的时间戳晚就听谁的。但 Mindwtr 的架构决策记录ADR里明确指出纯时间戳的 last-write-wins 有三个致命问题见 docs/adr/0003-revision-aware-sync.md设备时钟会漂移手机和电脑的时钟可能相差几秒甚至几分钟晚不等于新删除不能消失A 设备删掉了任务B 设备同时改了它如果简单比较时间戳删除可能被复活或者修改被静默吞掉时间戳完全相等时仍然需要一个确定性的裁决规则不能靠遍历顺序碰运气。所以 Mindwtr 选择了版本元数据 时间戳 墓碑 确定性平局裁决的组合方案。快照同步没有增量日志的轻量级路线在动手之前先理解 Mindwtr 同步的整体形态它做的是全量快照合并而不是逐条操作日志delta log。这一点在 docs/adr/0008-snapshot-sync-without-delta-log.md 中被明确决策并保留了个人 GTD 应用的实体数量小、设备数量少、数据属于个人而非团队协作整个数据是一个 JSON 快照文件本地持久化为 SQLite全文件写入简单且原子每条数据上自带的rev版本号和revBy最后修改者字段已经足以防止丢失更新不需要额外的操作日志。一次同步周期的流程非常直白拉取远端快照 → 归一化 → 逐实体合并 → 写回一份合并结果核心实现在 packages/core/src/sync.ts 与 packages/core/src/sync-cycle.ts 中。这也解释了为什么 Mindwtr 支持 iCloud、WebDAV、文件同步甚至自建云等多种后端——它们只是快照的搬运工真正的合并逻辑只有一份见 docs/adr/0010-self-hosted-cloud-sync-server.md所有通道行为完全一致。核心关键词①版本感知的合并算法Mindwtr 的合并策略按优先级依次比较每一级都是确定性的优先级比较信号说明1实体归一化合并前先把两侧数据清洗成可比较的形式sync-normalization.ts2版本号rev/revBy谁的版本更新谁赢——这是对抗时钟漂移的主力3时间戳版本号不可比时用操作时间排序4删除 vs 存活delete-vs-live规则删除和修改撞车时的专门裁决见下文5确定性平局裁决内容签名 稳定排序保证每台设备选出同一个赢家第 5 步值得展开当版本号和时间戳都无法区分时packages/core/src/sync-signatures.ts 会对任务内容做哈希签名再用确定性的平局规则如字典序选出赢家。确定性是这里的关键——不是随便选一个而是任何设备、任何时刻、重复计算都选出同一个。这就是无损同步的数学基础。核心关键词②墓碑Tombstone机制删除是怎么跨设备传播的答案是软删除墓碑删除一条任务时Mindwtr 不真正抹掉它而是给它盖上deletedAt时间戳让它以墓碑的身份继续参与同步把这里曾经有个东西被删了这个事实通知到每台设备。保留多久规则在 docs/adr/0005-tombstone-retention-policy.md 中定义墓碑默认保留90 天可在 1 天到 3650 天之间调整默认值见 packages/core/src/sync-tombstones.ts保留窗口内墓碑始终留在快照和同步载荷中——太早删掉长期离线回来的设备可能把已删除的任务复活过期后由显式的清理步骤purgeExpiredTombstones清除而不是在普通读取时顺手删被彻底清除purged的记录永不复活恢复操作会把它视为不存在。核心关键词③冲突解决的演进——存活数据优先删除 vs 修改是最棘手的冲突A 设备删除了任务B 设备几乎同一时刻修改了它听谁的Mindwtr 这里走过一次演进非常值得学习早期规则0.8.2 之前操作时间相等时墓碑优先——宁可错杀也不让删除消失ADR 0003实际流量暴露问题在时钟漂移的设备上这条规则太激进容易把有效的修改连同任务一起删掉现行规则ADR 0007在 docs/adr/0007-live-wins-in-ambiguous-delete-merge.md 中改为存活数据优先用操作时间删除取max(updatedAt, deletedAt)比较两个操作两者相差超过 30 秒较新的操作赢落在30 秒模糊窗口内版本号rev高的一边赢仍无法区分保留存活的任务而不是让删除默认获胜。这个设计体现了务实的工程哲学在可能丢一次删除和可能丢一次用户修改之间选择保住用户的修改——因为前者重新删一次就行后者是真实的劳动成果。这套机制对普通用户意味着什么离线随便用飞行模式下改了任务联网后自动同步合并结果在任何设备上都是同一个多后端随意切换iCloud、WebDAV、文件同步、自建云服务器共用同一套合并规则切换后端不会改变冲突行为删除可安全传播删掉的任务会在所有设备上消失而不会被某台离线设备救活数据量友好快照模型 墓碑定期清理让同步文件保持有界增长。想更深入阅读可以从这几份材料入手同步决策记录总目录docs/adr/README.md同步编排与周期串行化docs/adr/0014-sync-orchestration-ports.md、docs/adr/0016-sync-cycle-serialization.md附件的同步模型docs/adr/0011-attachment-sync-model.md合并设置逻辑packages/core/src/sync-merge-settings.ts小结Mindwtr 的多端无损同步 全量快照合并简单、原子×版本号优先的时间戳比较抗时钟漂移×墓碑软删除删除可传播、可收敛×确定性的平局裁决所有设备算出同一个结果。它没有引入复杂的 CRDT 或增量日志而是用一套小而完备的规则把个人待办应用最真实的同步场景做到了每台设备都一样。【免费下载链接】MindwtrGet tasks and ideas out of your head. A free GTD to-do app for desktop and mobile. Works offline, no account needed项目地址: https://gitcode.com/gh_mirrors/mi/Mindwtr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表