algorithm - 了解 Neil Fraser 的差分同步算法

标签 algorithm synchronization

我正在尝试完全理解 Differential Synchronization algorithm尤其是保证交付方法(第 4 节)。

synchronization cycle

我不明白为什么在同步周期的上半部分需要编辑堆栈

编辑堆栈的用途如下(从第 4 节的第二段复制):

[...] in the case of packet loss, the edits are queued up in a stack and are retransmitted to the remote party on every sync until the remote party returns an acknowledgment of receipt.

这是有道理的。但在第六段的后面(丢失返回数据包案例)它说:

This indicates that the previous response must have been lost. Therefore the server deletes its edit stack and copies the Backup Shadow into Shadow Text (step 4).

所以,据我了解:

  • 在正常操作期间:编辑堆栈(在上半部分)将包含一个条目,该条目在下一个同步周期中被确认并删除。

  • 如果出现网络错误:客户端无法确认编辑堆栈,然后服务器将简单地清除它。

如果这是正确的,那么上半部分的编辑堆栈将是空的或包含一个条目。此外,在任何情况下,该单一条目都不会(重新)发送回客户。让它完全没用?!

那么显而易见的问题是,为什么我们需要一个编辑堆栈(在上半部分)?

我确信我遗漏了一些重要的东西。请帮帮我。

最佳答案

您的观点适用于客户端-服务器 架构。服务器的 Edits 堆栈是更通用的对称表示的保留,其中客户端和服务器具有相同的功能和结构(特别是,任何一方都可以发起通信)。虽然客户端的 Backup Shadow 最好在客户端-服务器设置中删除以节省空间/时间,但 Edits 仍然可以使用堆栈数据结构而没有任何缺点,并且一致的 API 的好处。请注意,该算法大约可追溯到 2009 年。今天(2017 年),您可能会选择使用 WebSockets 或 WebRTC。差分同步算法预期并适应这样一种设置,其中双方本质上是对等并遵循相同的协议(protocol)。

关于algorithm - 了解 Neil Fraser 的差分同步算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29489409/

相关文章:

c++ - 用 vector 编写算法的问题

go - 如何与 time.After 进行惯用同步?

java - AtomicLongMap 读取线程安全

python - 为什么我的快速排序在 python 中这么慢?

javascript - 如何修改重新排序 <ul> 的算法?

linux-kernel - 自旋锁死机疑似原因

java - 同步不同类(和不同包)中的两个方法

c++ - C++ 17 POSIX信号量或condition_variable?

java - 在 O(n) 时间内找到正确的路径

java - 固定大小队列的空间复杂度