同步引擎是 Joplin 中管理设备与远程存储服务(同步目标)之间数据同步的核心组件。它负责处理本地更改的上传、远程更改的下载、冲突解决以及同步过程中的端到端加密。此页面记录了同步引擎的架构和工作流程、它如何与其他组件交互以及它为确保可靠同步而采用的各种机制。
有关实现特定同步目标的信息,请参阅同步目标。
同步引擎由多个组件组成,这些组件协同工作,为跨设备和同步目标提供可靠的同步体验。
来源
同步器:协调整个同步过程的主要类。它负责处理更改的上传、下载和冲突解决。
FileApi:一个用于与同步目标交互的抽象接口。它提供了在同步目标上创建、读取、更新和删除文件的方法。
LockHandler:管理锁以防止多个客户端同时同步,这可能导致冲突。
MigrationHandler:当新版本需要更改同步结构时,负责升级同步目标。
EncryptionService:管理在数据上传到同步目标之前对其进行端到端加密。
ResourceService:管理资源(附件),这些资源由于其大小而需要特殊处理。
JoplinServerApi:当用作同步目标时,用于与 Joplin Server 通信的客户端。
同步过程分为 UPDATE_REMOTE、DELETE_REMOTE 和 DELTA 三个主要阶段。这些阶段可以单独执行,也可以在完整同步中一起执行。
来源
在实际同步开始之前,同步器会
来源
在此阶段,本地更改将被推送到同步目标。
来源
在此阶段,本地删除的项目将从同步目标中删除。
来源
在此阶段,同步目标中的更改将被应用于本地。
同步引擎使用锁定系统来防止多个设备同时同步,这可能导致冲突和数据损坏。
来源
排他锁 (LockType.Exclusive):用于需要对同步目标进行排他访问的操作,例如迁移。一次只有一个客户端可以持有排他锁。
同步锁 (LockType.Sync):用于正常同步。多个客户端可以同时持有同步锁,但前提是没有排他锁存在。
来源
LockHandler 处理锁操作。
来源
当同一项目在同步之间被多个设备修改时,就会发生冲突。同步引擎有机制来检测和处理这些冲突。
来源
在以下情况下会检测到冲突:
来源
检测到冲突时:
is_conflict 标志。来源
同步引擎支持端到端加密(E2EE),以确保数据在离开客户端之前被加密。
来源
来源
来源
Joplin 通过 FileApi 接口支持多种同步目标。
来源
FileApi 接口为所有同步目标提供了一组通用操作。
来源
Joplin Server 是官方同步目标,具有增强功能。
来源
由于附件的体积可能很大,因此在同步过程中需要特殊处理资源(附件)。
来源
上传资源时:
来源
资源是懒加载的。
FETCH_STATUS_IDLE。FETCH_STATUS_DONE。来源
在使用 Joplin Server 或 Joplin Cloud 作为同步目标时,Joplin 支持共享笔记本和与其他用户协作。
来源
当一个文件夹被共享时:
share_id 属性。share_id。share_id 会传播到所有子项来源
同步期间
来源
同步引擎包含多项优化以提高性能
来源
当 Joplin 新版本引入结构性更改时,同步目标可能需要数据库迁移。
来源
来源
Joplin 同步引擎是一个复杂的系统,它处理跨设备和各种同步目标的数据同步。它管理端到端加密、冲突解决、资源处理和共享的复杂性,同时提供无缝的用户体验。模块化设计和清晰定义的接口允许通过新的同步目标和功能扩展该系统。