同步简介

本文档简要介绍了同步在桌面版 Firefox 中的实现方式。

通用、历史、同步引擎的结构

本节描述了同步过去是如何工作的——实际上,其中很大一部分仍然如此。虽然我们讨论了这一点是如何缓慢变化的,但这种背景知识很有价值。

对于任何同步的数据类型,往往有 3 个部分

存储

同步 store 与实际的 Firefox 桌面存储交互。例如,在 passwords 引擎中,“存储”是指与 Services.logins 交互的那一层。

跟踪器

tracker 知道哪些内容应该同步。例如,当用户创建或更新密码时,正是跟踪器知道我们现在应该同步,以及应该更新哪些特定密码。

这通常是通过“观察者”通知来完成的——Services.loginsplaces 等在发生某些事件时都会发送特定的通知(实际上,其中一些是为了同步的利益而添加的)。

引擎

engine 将所有内容联系在一起。它与 storetracker 协同工作,并跟踪其自己的元数据(例如,服务器上密码的时间戳,以便它知道如何获取仅更改的记录以及如何将其传递给 store,以便可以更新实际的基础存储)。

以上所有部分通常都在 services/sync/modules/engines 目录 中,并且与它们同步的数据分离。

桌面特定同步引擎的未来

上面描述的系统反映了这样一个事实:同步是相对较晚“附加”到桌面版 Firefox 上的——例如,同步 store 与实际的 store 分离。这导致了许多问题——尤其是在 tracker 和引擎使用的元数据方面,以及对后端存储的更改经常会忘记同步存在的事实。

在过去几年里,同步团队得出结论,同步支持必须更紧密地集成到存储本身中。例如,Services.logins 应该跟踪何时发生会导致项目同步的更改。它还应该跟踪存储的元数据,以便如果(例如)通过创建新的空数据库来恢复损坏的数据库,元数据也应该消失,以便同步知道发生了某些错误并可以恢复。

但是,这是一个缓慢的过程——目前,bookmarkshistorypasswords 遗留引擎已经得到了改进,因此存储承担了更多的责任。在所有情况下,由于实现原因,同步实现仍然具有 store,但它往往是围绕实际底层存储的薄包装器。

跨平台同步引擎的未来

在 application-services 存储库中实现了多个用 Rust 编写的同步引擎。虽然这些通常是为移动平台完成的,但长期希望是它们可以重复用于桌面。 代码树中的同步引擎 提供了更多关于这些引擎的详细信息。

虽然没有现有的引擎被用 Rust 实现的引擎替换,但 webext-storage 引擎是通过 application-services 用 Rust 实现的,因此它不倾向于使用上面描述的任何基础设施。

希望随着时间的推移,我们将在桌面版 Firefox 中找到更多用 Rust 实现的引擎。