Docs 菜单
Docs 主页
/ /
Atlas App Services
/ /

Atlas Device Sync 协议

在此页面上

  • Overview
  • 关键概念
  • 变更集
  • 运营转型
  • 客户端文件标识符
  • 网络安全
  • 同步会话进程
  • 客户端连接到应用服务器
  • 客户端启动同步会话
  • App Services 分配新的客户端文件标识符
  • 客户端发送客户端标识符
  • 客户端上传和下载同步变更集
  • 客户端终止同步会话
  • 请求类型
  • 客户端 -> 服务器消息
  • 服务器 -> 客户端消息

Atlas Device Sync使用协议在多个客户端之间正确、高效地实时同步数据更改,每个客户端都维护自己的本地Realm文件。 该协议定义了一设立预定义的请求类型以及客户端(例如Realm 软件开发工具包(Realm SDK))可以连接到Atlas App Services应用程序服务器并同步数据的进程

注意

Realm SDK 在内部实现和托管同步协议,因此对于大多数应用程序,您无需了解同步协议即可使用 Device Sync。本页概括性地介绍了该协议,而不是实现规范。

变更集是一系列指令,描述一个或多个写入操作对已知对象状态或版本所做的粒度修改。 变更集是同步协议的基本单位。 同步 域 客户端每次执行写入操作时都会向 Device Sync 服务器发送变更集。服务器向每个连接的客户端发送其他客户端执行的写入操作的变更集。

Device Sync 服务器随时接受来自任何连接的同步客户端的变更集(包括同步的 MongoDB cluster 中的变更),并使用操作转换算法将变更序列化为线性顺序,并在将变更集发送到连接的客户端之前解决冲突的变更集。

注意

增量同步

当您对同步对象进行更改时, App Services不会重新上传整个对象。 相反, App Services仅发送之前和之后之间的差值(“增量”)。 该服务使用 zlib 压缩增量 压缩。这样可以减少网络负载,在移动网络条件下尤其有用。

操作转换是一种函数,给定两个变更集,生成第三个变更集,该变更集表示在逻辑上应用一个给定的变更集。 Device Sync 使用操作转换来解决来自不同同步客户端且应用于同一基本状态的变更集之间的冲突。

即使启用了同步,Realm 也是一个离线优先的本地数据库,这意味着任何设备都可以执行离线写入,并在稍后重新建立网络连接时上传相应的变更集。 操作转换算法旨在从容处理相对于逻辑服务器时钟“无序”到达的变更集,以便每个同步的 Realm 文件收敛到每个已更改对象的相同版本。

提示

Realm 变更集上的操作转换类似于 变基操作 在 Git 中。

客户端文件标识符是唯一标识同步的客户端 Realm 文件及其相应服务器文件的值。 每当 SDK 在 Realm 文件的初始同步期间请求客户端文件标识符时,服务器都会生成客户端文件标识符。 每个标识符都是严格小于 2^63 的 64 位非零正符号整数。

注意

服务器保证代表特定服务器文件生成的所有标识符都是唯一的。 如果两个客户端文件与不同的服务器文件关联,则服务器可以自由地为这两个客户端文件生成相同的标识符。

SDK 通过使用 TLS1.3 的 HTTPS 保护的 WebSocket 连接与应用程序服务器同步。

为了启动、执行和终止 Device Sync 同步会话,Realm SDK 和应用程序服务器会发送和接收一组特定于协议的请求。

SDK 通过HTTP协商 WebSocket 连接,然后通过 WebSocket 连接向服务器发送 BINDIDENT请求,从而建立同步会话。 建立会话后,SDK 和服务器就会通过UPLOADDOWNLOAD消息向对方发送给定Realm 文件的同步变更集。 要结束会话,SDK 会发送UNBIND请求。

Realm SDK App Server
| |
| <---- 1. HTTP Handshake -----> |
| |
| --------- 2. BIND -----------> |
| |
| <-- 3. IDENT (first time) ---- |
| |
| --------- 4. IDENT ----------> |
| |
| <---- 5. UPLOAD/DOWNLOAD ----> |
| |
| --------- 6. UNBIND ---------> |
1

同步协议主要通过 SDK 和服务器之间的 WebSocket 连接进行处理。 要建立连接,SDK 会发送握手 HTTP 请求,其中包括以下内容:

  • 协议版本

  • WebSocket 密钥

  • 经过身份验证的 App Services 应用程序用户的有效访问令牌

服务器发送 HTTP101 Switching Protocols 响应,用于指定 SDK 的 WebSocket 连接。同步协议的其余部分通过此连接进行。

2

要开始同步会话,Realm SDK 会向 Device Sync 服务器发送BIND请求。 该请求会标识要同步的特定本地 Realm 数据库文件,并包含服务器将用于打开与 SDK 的双向连接的 WebSocket 连接密钥。

如果 SDK 是首次尝试同步特定Realm数据库文件,则它尚不具备服务器为该文件生成的客户端标识符。 在这种情况下, BIND请求还指示Device Sync服务器应分配一个。

3

如果BIND请求指示 SDK 需要客户端文件标识符,则Device Sync服务器会为指定的Realm数据库文件生成唯一值,并在IDENT响应中将其发送到 SDK。 当 SDK 收到IDENT时,它会将新的客户端标识符永久存储在本地Realm数据库文件中。

SDK 只需要在首次同步每个 Realm 数据库文件时请求客户端文件标识符。 对于后续同步会话,SDK 可以使用持久标识符。

4

一旦 SDK 通过BIND请求启动同步会话,它就必须识别要同步的本地Realm数据库文件。 为此,SDK 会向应用程序服务器发送一条包含客户端文件标识符的IDENT消息。 如果 SDK 以前已将域与服务器同步,则可以指定最近同步的服务器版本以优化同步进程。

当服务器收到IDENT消息时,将建立会话。 SDK 和服务器现在可以随时自由发送上传和下载同步变更集。

5

建立同步会话后,SDK 和服务器就可以自由发送和接收UPLOADDOWNLOAD消息,以便在发生变更时进行同步。

SDK 会为其应用的每个变更集发送一条UPLOAD消息,但通过DOWNLOAD消息从服务器收到的变更集除外。

当服务器收到UPLOAD消息时,它会应用操作转换来解决与其他变更集的任何冲突,然后将转换后的变更集应用于域的服务器版本。 这会触发服务器向其他已连接的客户端发送DOWNLOAD消息,包括镜像服务器域的同步Atlas 集群。 DOWNLOAD消息根据服务器的历史记录,按从最早到最新的时间顺序对一个或多个转换后的变更集进行分组。 SDK 以相同的顺序应用变更集。

6

建立同步会话后, Device Sync服务器将继续接受UPLOAD消息并发送DOWNLOAD消息,直到 SDK 终止会话。 要终止同步会话,SDK 会向Device Sync服务器发送UNBIND请求。

下表描述了同步客户端可以发送到 Device Sync 服务器的请求类型:

请求
说明
BIND

在服务器上启动新的同步会话,并为当前应用程序用户提供签名的授权令牌。 如果客户端尚不具备要同步的Realm 文件的客户端文件标识符,这也表明服务器应生成一个标识符并将其发送回客户端。

客户端必须先发送 BIND,然后才能发送任何其他请求。

IDENT

提供指示以下内容的客户端文件标识符

  • 要同步的 Realm 文件

  • 客户端 Realm 的当前版本

  • 客户端 Realm 最近同步的服务器版本

此请求与客户端请求客户端文件标识符时服务器发送的IDENT消息相关但不同。

UPLOAD
为客户端上发生的操作指定一个或多个变更集。 变更集按客户端版本升序列出。
TRANSACT
指定描述客户端上发生的序列化事务的变更集。 在服务器确认或拒绝事务之前,客户端不得上传任何其他变更集。
UNBIND

结束正在运行的同步会话。

客户端不得为UNBOUND会话发送任何其他请求。

MARK
请求服务器在同步服务器历史记录中的最新变更集时(在请求时)通知客户端。
REFRESH
使用新的用户令牌重新授权当前同步会话。
STATE_REQUEST
请求服务器发送一条或多条STATE消息,客户端使用这些消息下载Realm 文件的当前服务器版本。 客户端在异步打开同步域时会发出状态请求。
CLIENT_VERSION_REQUEST
请求服务器发送由客户端发送并由服务器处理的最新变更集的客户端版本。 这在 SDK 执行客户端重置时最常使用。
PING

表示客户端仍处于连接状态,服务器应保持同步会话。 客户端必须每10分钟至少向服务器发送一个 PING。 服务器使用PONG对每个 PING 进行确认。

如果服务器超过 10 分钟没有收到来自客户端的网络探测(ping),则认为客户端已断开连接,可能会自动结束会话。

下表描述了 Device Sync 服务器可以发送到同步客户端的请求类型:

请求
说明
IDENT
提供服务器为响应请求标识符的 而生成的 客户端文件 BIND标识符。
DOWNLOAD

为其他客户端上发生的操作指定一个或多个变更集(总计最多16 MB)。 变更集按服务器版本升序列出。

下载中的变更集可能与其他客户端上传的变更集并不完全相同。 相反,它们可能是 Device Sync 的操作转换算法输出的等效变更集。

UNBOUND
指定服务器结束同步会话以响应UNBIND
TRANSACT
指示服务器是否成功处理了客户端在TRANSACT中指定的变更集。
MARK
表示服务器已向客户端发送当服务器从客户端收到 时服务器历史记录中的最新 变更集 MARK
STATE
包含一个或多个编码数据段,客户端可以将这些数据段连接起来以构造 Realm 的最新服务器版本。 为响应STATE_REQUEST而发送。
CLIENT_VERSION
指定由客户客户端发送并由服务器处理的最新变更集的客户端版本。 为响应CLIENT_VERSION_REQUEST而发送。
ERROR
表示服务器遇到似乎由连接的客户端引起的问题。 有关详细信息,请参阅同步客户端错误。
PONG
确认PING 。 如果客户端没有收到 PING 确认,则表明客户端当前无法通过网络与服务器通信,并且服务器可能未收到相应的PING

后退

冲突解决方案