返回
加速CRDTs:优化探索之旅
闲谈
2023-11-03 08:51:29
CRDTs 简介
CRDTs 是一种数据结构,能够让多个用户同时编辑同一份文档,而不会产生冲突。这是因为 CRDTs 使用了一种特殊的算法,该算法能够自动合并来自不同用户的编辑操作。
CRDTs 的工作原理如下:
- 每个用户都有一个本地副本。
- 当用户编辑文档时,编辑操作会首先应用到本地副本。
- 然后,本地副本会将编辑操作广播给其他用户。
- 其他用户收到编辑操作后,会将编辑操作应用到自己的本地副本。
- 由于 CRDTs 使用了一种特殊的算法,因此来自不同用户的编辑操作不会产生冲突。
使用 automerge 和 yjs 实现 CRDTs
automerge 和 yjs 是两个流行的开源框架,可以用来实现 CRDTs。automerge 使用一种称为“乐观并发控制”(OCC)的算法,而 yjs 使用一种称为“状态向量时钟”(VC)的算法。
OCC 算法的工作原理如下:
- 每个用户都有一个本地副本。
- 当用户编辑文档时,编辑操作会首先应用到本地副本。
- 然后,本地副本会将编辑操作广播给其他用户。
- 其他用户收到编辑操作后,会尝试将编辑操作应用到自己的本地副本。
- 如果编辑操作与本地副本的编辑操作冲突,则会发生冲突。
- 发生冲突时,automerge 会回滚冲突的编辑操作,并重新应用编辑操作。
VC 算法的工作原理如下:
- 每个用户都有一个本地副本。
- 当用户编辑文档时,编辑操作会首先应用到本地副本。
- 然后,本地副本会将编辑操作广播给其他用户。
- 其他用户收到编辑操作后,会将编辑操作应用到自己的本地副本。
- 如果编辑操作与本地副本的编辑操作冲突,则会发生冲突。
- 发生冲突时,yjs 会使用状态向量时钟来确定哪个编辑操作应该被保留。
优化 CRDTs
作者在 automerge 和 yjs 之上做了一些创造性的优化,使 CRDTs 的速度提高了 5000 倍。这些优化包括:
- 使用一种新的数据结构来存储文档。
- 使用一种新的算法来合并来自不同用户的编辑操作。
- 使用一种新的算法来检测冲突。
这些优化使得 CRDTs 能够在更大的文档上运行,并能够支持更多的用户同时编辑同一份文档。
结论
CRDTs 是一种非常适合用于协作编辑应用程序的数据结构。它们能够让多个用户同时编辑同一份文档,而不会产生冲突。automerge 和 yjs 是两个流行的开源框架,可以用来实现 CRDTs。作者在这些框架之上做了一些创造性的优化,使 CRDTs 的速度提高了 5000 倍。