Atlas Device Sync 协议
在此页面上
Overview
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 位非零正符号整数。
注意
服务器保证代表特定服务器文件生成的所有标识符都是唯一的。 如果两个客户端文件与不同的服务器文件关联,则服务器可以自由地为这两个客户端文件生成相同的标识符。
网络安全
同步会话进程
为了启动、执行和终止 Device Sync 同步会话,Realm SDK 和应用程序服务器会发送和接收一组特定于协议的请求。
SDK 通过HTTP协商 WebSocket 连接,然后通过 WebSocket 连接向服务器发送 BIND
和IDENT
请求,从而建立同步会话。 建立会话后,SDK 和服务器就会通过UPLOAD
和DOWNLOAD
消息向对方发送给定Realm 文件的同步变更集。 要结束会话,SDK 会发送UNBIND
请求。
Realm SDK App Server | | | <---- 1. HTTP Handshake -----> | | | | --------- 2. BIND -----------> | | | | <-- 3. IDENT (first time) ---- | | | | --------- 4. IDENT ----------> | | | | <---- 5. UPLOAD/DOWNLOAD ----> | | | | --------- 6. UNBIND ---------> |
客户端连接到应用服务器
同步协议主要通过 SDK 和服务器之间的 WebSocket 连接进行处理。 要建立连接,SDK 会发送握手 HTTP 请求,其中包括以下内容:
协议版本
WebSocket 密钥
经过身份验证的 App Services 应用程序用户的有效访问令牌
服务器发送 HTTP101 Switching Protocols 响应,用于指定 SDK 的 WebSocket 连接。同步协议的其余部分通过此连接进行。
客户端上传和下载同步变更集
建立同步会话后,SDK 和服务器就可以自由发送和接收UPLOAD
和DOWNLOAD
消息,以便在发生变更时进行同步。
SDK 会为其应用的每个变更集发送一条UPLOAD
消息,但通过DOWNLOAD
消息从服务器收到的变更集除外。
当服务器收到UPLOAD
消息时,它会应用操作转换来解决与其他变更集的任何冲突,然后将转换后的变更集应用于域的服务器版本。 这会触发服务器向其他已连接的客户端发送DOWNLOAD
消息,包括镜像服务器域的同步Atlas 集群。 DOWNLOAD
消息根据服务器的历史记录,按从最早到最新的时间顺序对一个或多个转换后的变更集进行分组。 SDK 以相同的顺序应用变更集。
请求类型
客户端 -> 服务器消息
下表描述了同步客户端可以发送到 Device Sync 服务器的请求类型:
请求 | 说明 |
---|---|
在服务器上启动新的同步会话,并为当前应用程序用户提供签名的授权令牌。 如果客户端尚不具备要同步的Realm 文件的客户端文件标识符,这也表明服务器应生成一个标识符并将其发送回客户端。 客户端必须先发送 BIND,然后才能发送任何其他请求。 | |
为客户端上发生的操作指定一个或多个变更集。 变更集按客户端版本升序列出。 | |
指定描述客户端上发生的序列化事务的变更集。 在服务器确认或拒绝事务之前,客户端不得上传任何其他变更集。 | |
结束正在运行的同步会话。 客户端不得为 | |
请求服务器在同步服务器历史记录中的最新变更集时(在请求时)通知客户端。 | |
使用新的用户令牌重新授权当前同步会话。 | |
请求服务器发送一条或多条 STATE 消息,客户端使用这些消息下载Realm 文件的当前服务器版本。 客户端在异步打开同步域时会发出状态请求。 | |
请求服务器发送由客户端发送并由服务器处理的最新变更集的客户端版本。 这在 SDK 执行客户端重置时最常使用。 | |
表示客户端仍处于连接状态,服务器应保持同步会话。 客户端必须每10分钟至少向服务器发送一个 PING。 服务器使用 如果服务器超过 10 分钟没有收到来自客户端的网络探测(ping),则认为客户端已断开连接,可能会自动结束会话。 |
服务器 -> 客户端消息
下表描述了 Device Sync 服务器可以发送到同步客户端的请求类型:
请求 | 说明 |
---|---|
指定服务器结束同步会话以响应 UNBIND 。 | |
指示服务器是否成功处理了客户端在 TRANSACT 中指定的变更集。 | |
表示服务器已向客户端发送当服务器从客户端收到 时服务器历史记录中的最新 变更集 MARK 。 | |
包含一个或多个编码数据段,客户端可以将这些数据段连接起来以构造 Realm 的最新服务器版本。 为响应 STATE_REQUEST 而发送。 | |
指定由客户客户端发送并由服务器处理的最新变更集的客户端版本。 为响应 CLIENT_VERSION_REQUEST 而发送。 | |
表示服务器遇到似乎由连接的客户端引起的问题。 有关详细信息,请参阅同步客户端错误。 | |