自动合并同步

问题描述 投票:0回答:1

问题

我已经实现了一个系统,前端和后端可以对 CRDT 文档进行更改。

前端和后端通过 Websocket 进行通信,并且在某个时刻这两对将同步。

问题是,如果前端在没有同步所有内容的情况下关闭套接字,则最新的更改永远不会保留。

如何暂停关闭套接字,直到前端文档和后端文档同步最新更改?

临时解决方案

当我检测到套接字将要关闭时,我所做的就是询问后端文档是否有前端的最新更改。

为此,我使用 automerge 的

getAllChanges
函数并查看前端发送的哈希是否存在。

但是要做到这一点,我必须一遍又一遍地阅读文档中的所有更改......

node.js websocket crdt automerge
1个回答
0
投票

我正在从事类似的工作,最终使用提供的同步协议。 根据文档,计划是在每次更改时发送由generateSyncMessage生成的消息。

万一恢复,您可以重播所有更改。

免责声明:我尚未成功获取文档后的syncMessage 中的所有更改。以下是如何根据文档生成synceMessag的示例:

 const dummyDoc = automerge.change(automerge.from(
            {content: ""}), doc => { doc.content = "dummy" })
 let dummyState = automerge.initSyncState()
 let msg: Uint8Array | null = null;
 [dummyState, msg] = automerge.generateSyncMessage(dummyDoc, dummyState)

通过网络发送消息......在对等端:

let msg: Uint8Array | null = null;
[peerDoc, peerSyncState, msg] = automerge.receiveSyncMessage(this._document, this._syncState, message);
if (msg) {
 // communicate that back to the first peer.
}

这样应该有一些来回......直到文档完全同步......

为了确保更改不会因连接重置或网络问题而丢失,我们还可以向通信通道添加一些缓冲。

希望我有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.