CRDT协同编辑:修改树的节点层级Mutable Tree Hierarchy(2)
CRDT协同编辑

优先级问题
这里有几个优先级的问题要注意。
首先是选择历史父节点的优先级的问题。
节点挑选最近历史父节点,优先级逻辑为:
- 必须是 rooted 节点;
- counter 大的优先;
- 若多个父节点的 counter 相同(同步时可能出现),使用 Last-Writer-Win 策略选择最新的一个。
然后是子节点的处理顺序也需要符合特定优先级规则的,因为不注意顺序的话,先处理 A 和先处理 B 的这两者的结果是不同的。
前面我们是先处理 A,结果是 A 会在 C 下。但如果是先处理 B,那 B 会在 C 下,会出现最终数据不一致问题。
所以这里也要有优先级,比如让 id 小的 non-rooted 节点优先处理。
可以配合优先级队列数据结构使用。
固化新旧父节点路径
这里还有一个特殊场景要处理。
经过前面的操作,我们的 A 和 B 的 edges 是这样的:
{
A: { C: 0, B: 1 },
B: { C: 0, A: 1 }
}
图形树是这样的:

此时,我们再将 B 的 parent 指向 D。根据前面的逻辑,加上一个B: { D: 2 }, edges 变成这样:
{
A: { C: 0, B: 1 },
B: { C: 0, A: 1, D: 2 }
}
取 edges 中 counter 最大值为父节点,都是 rooted 节点,结果为:

然后你发现,没有移动 A,但 A 居然跑到 B 下面去了,这是不符合用户预期的。
为解决这个问题,我们需要做以下操作。
B 节点从原父节点 A 下移动到 D 下前,我们需要把父节点 A 进行固化操作,即把原父节点 A 的 edges 中当前真正的 parent,即 C,的 counter,设置为最大值的 counter 加一。
如果 counter 已经是最大值了,则不需要进行操作了。
这样是为了确保下次 reparent 时还是原来的 parent。
这里我们会额外多了个 A: {C: 2},于是:
A: { C: 0, B: 1 }
变成了:
A: { C: 2, B: 1 }
原父节点 A 到根节点的所有节点都要进行这个操作,新父节点 D 到根节点的所有节点也要做同样处理。
修正后的 edegs 为:
{
A: { C: 2, B: 1 },
B: { C: 0, A: 1, D: 2 }
}
具体的过程为:
相关阅读
-
剑侠世界官方网站 剑侠世界1手游官网地址
文章摘要:剑侠世界官方网站和剑侠世界1手游官网地址的IT知识,具体内容如下: 九月的开头,是秋风和夏暑的交接礼,是开学和假期的分割线,伴随着莘莘学子的入学礼,江湖也即将迎来一
-
5G-Advanced优势有哪些
关于这方面的知识你知道吗?5G-Advanced优势有哪些的电脑小知识,下面为详细的介绍。 容量提升与速度飞跃 5G Advanced将继续挑战7 GHz以下和毫米波频谱的频谱效率限制。通过不断优化MIMO技术,
-
网站建设哪里好做 搭建网站平台推荐
您可能不了解网站建设哪里好做和搭建网站平台推荐的电脑方面的小经验,具体内容如下: 很多想要做网站的朋友都不清楚网站建设公司哪家好?今天我们就来为大家推荐一下,并且同时带大
-
对线面试官 – TCP_IP四层网络模型经典连环问
为大家介绍的是对线面试官及的IT小经验,具体详情如下: 面试官 :TCP、IP四层模型有了解吗?可以简单说说嘛。 不念:主要包括 数据链路层 、 网络层 、 传输层 、 应用层 。 面试官 :可以


