文档核心概念如何选择合适的 CRDT 类型

如何选择合适的 CRDT 类型

选择合适的 CRDT 类型,意味着要理解它们在并发编辑下可能出现的行为,并判断这些行为是否符合应用需求。

针对文本内容,你可以把它直接存成 Map 上的 Value(值可以是字符串类型),也可以使用 Text CRDT。前者每次操作都会完全覆盖之前的结果,因此如果 A 和 B 同时修改,最终只会保留一方的编辑。后者会保留双方的并发插入,并且将并发删除合并成一次删除。对于大多数文本框编辑,你可能会更倾向于后者;但在编辑链接一类需要整体替换的场景,前者可能更合适。

对于列表(List),若同时删除同一元素并插入单个元素,会产生一个新元素,这与 Map 上 Set 的语义不同(未来可能会提供针对列表的 set 方法)。如果要表示坐标,最好使用 Map 而不是 List。假设你用数组 [x, y] 表示坐标,客户端 A 通过删除并重新插入 y_a 来更新 y,客户端 B 则删除 y 并插入 y_b,合并后数组会变成 [x, y_a, y_b],与用户期望的结构不符;改用 Map 表示则可以避免这一问题。