”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 了解无冲突复制数据类型

了解无冲突复制数据类型

发布于2024-11-07
浏览:658

无冲突复制数据类型 (CRDT) 是一类数据结构,可在分布式系统中实现无缝协作和数据同步,从而实现无冲突的协作更新。 CRDT 旨在实现跨多个数据副本的最终一致性,确保即使更新独立发生,所有副本也能收敛到相同状态,而不需要复杂的冲突解决机制。

在这篇博文中,我们将深入研究 CRDT 是什么,探索它们的用途和类型,了解它们的工作原理,并学习如何实现它们,重点关注 JavaScript 和强大的 Yjs 库。

CRDT 的用例

CRDT 在实时协作和离线支持至关重要的场景中特别有用:

  1. 协作文本编辑器:Google Docs、Notion 和 Etherpad 使用类似 CRDT 的结构进行实时编辑。
  2. 协作设计工具:Figma 是一种流行的基于 Web 的设计工具,它使用 CRDT 来实现设计项目的实时协作。多个设计人员可以同时处理同一个文件,所有用户之间的更改可以无缝同步。
  3. 分布式数据库:RxDB 和 Riak 使用 CRDT 进行无冲突复制。
  4. 多人游戏:用于保持玩家之间一致的游戏状态。

CRDT 的类型

CRDT 主要有两种类型:

  1. 基于状态的 CRDT:它们复制数据结构的整个状态。合并是通过比较和协调不同副本的状态来完成的。
  2. 基于操作的 CRDT:它们复制对数据结构执行的操作。合并是通过以交换方式应用来自不同副本的操作来完成的。

CRDT 的工作原理

CRDT(无冲突复制数据类型)的运行原理可确保所有数据副本的最终一致性,即使是同时进行更新或发生网络分区时也是如此。让我们更深入地研究一下机制:

主要特性

  1. 交换性:该属性确保运算顺序不会影响最终结果。例如,在计数器 CRDT 中,先递增 2,然后再递增 3,与先递增 3,然后再递增 2 产生的结果相同。
  2. 关联性:这意味着操作的分组并不重要。再次使用计数器示例,(1 2) 3 与 1 (2 3) 相同。
  3. 幂等性:多次应用相同的操作与应用一次效果相同。这对于处理分布式系统中的重复消息至关重要。

冲突解决

CRDT 通过设计自动解决冲突:

  • 对于基于状态的 CRDT (CvRDT),这是通过组合两个副本的状态的合并函数来实现的。此合并函数必须是可交换的、关联的和幂等的。
  • 对于基于操作的 CRDT (CmRDT),操作被设计为可交换的,确保以任何顺序应用它们都会导致相同的最终状态。

逻辑时钟

许多 CRDT 实现使用逻辑时钟(例如版本向量或点分版本向量)来跟踪操作的因果历史。这有助于确定并发操作的顺序以及确定副本已经看到哪些更新。

在 JavaScript 中使用 CRDT 和 Yjs

从头开始实施 CRDT 可能很复杂。但是,有一些库可以简化该过程。对于 JavaScript,最流行的 CRDT 库之一是 Yjs。它是一个高性能的CRDT实现,支持各种数据类型。让我们使用 Yjs 创建一个简单的待办事项列表应用程序,模拟多个用户处理内存中的同一文档。

下面是如何使用 Yjs 实现共享待办事项列表的示例:
Understanding Conflict-Free Replicated Data Types

让我们使用创建的 ydocs :
Understanding Conflict-Free Replicated Data Types

在此示例中,我们创建两个 Yjs 文档(ydoc1 和 ydoc2)来模拟两个用户处理同一待办事项列表。每个文档都有自己的待办事项共享地图。

我们定义了添加、更新和删除待办事项的函数,以及用于手动同步两个文档之间的状态的syncDocs函数。这模拟了在客户端之间交换更新的网络环境中会发生的情况。

结论

CRDT 为构建可在线和离线无缝工作的协作分布式应用程序提供了强大的解决方案。虽然底层概念可能很复杂,但像 Yjs 这样的库使开发人员可以更轻松地在其应用程序中利用 CRDT 的强大功能。随着分布式系统变得越来越普遍,理解和利用 CRDT 将成为开发人员越来越有价值的技能。

有用的链接

  1. Yjs
  2. CRDT
  3. Tiptap - 协作文本编辑器
版本声明 本文转载于:https://dev.to/adityasajoo/understanding-conflict-free-replicated-data-types-57jc?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-07-04
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    编程 发布于2025-07-04
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-07-04
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-07-04
  • 解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    Resolving Incorrect String Value Exception When Inserting EmojiWhen attempting to insert a string containing emoji characters into a MySQL database us...
    编程 发布于2025-07-04
  • 编译器报错“usr/bin/ld: cannot find -l”解决方法
    编译器报错“usr/bin/ld: cannot find -l”解决方法
    错误:“ usr/bin/ld:找不到-l “ 此错误表明链接器在链接您的可执行文件时无法找到指定的库。为了解决此问题,我们将深入研究如何指定库路径并将链接引导到正确位置的详细信息。添加库搜索路径的一个可能的原因是,此错误是您的makefile中缺少库搜索路径。要解决它,您可以在链接器命令中添加...
    编程 发布于2025-07-04
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    编程 发布于2025-07-04
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-07-04
  • C++中如何将独占指针作为函数或构造函数参数传递?
    C++中如何将独占指针作为函数或构造函数参数传递?
    在构造函数和函数中将唯一的指数管理为参数 unique pointers( unique_ptr [2启示。通过值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法将唯一指针的所有权转移到函数/对象。指针的内容被移至功能中,在操作...
    编程 发布于2025-07-04
  • Java中假唤醒真的会发生吗?
    Java中假唤醒真的会发生吗?
    在Java中的浪费唤醒:真实性或神话?在Java同步中伪装唤醒的概念已经是讨论的主题。尽管存在这种行为的潜力,但问题仍然存在:它们实际上是在实践中发生的吗? Linux的唤醒机制根据Wikipedia关于伪造唤醒的文章,linux实现了pthread_cond_wait()功能的Linux实现,利用...
    编程 发布于2025-07-04
  • 切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    编程 发布于2025-07-04
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-07-04
  • 查找当前执行JavaScript的脚本元素方法
    查找当前执行JavaScript的脚本元素方法
    如何引用当前执行脚本的脚本元素在某些方案中理解问题在某些方案中,开发人员可能需要将其他脚本动态加载其他脚本。但是,如果Head Element尚未完全渲染,则使用document.getElementsbytagname('head')[0] .appendChild(v)的常规方...
    编程 发布于2025-07-04
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:( - 215)!empty()in Function openCv in Function MultSiscale中的“检测”中的错误:在功能检测中。”当Face Cascade分类器(即面部检测至关重要的组件)未正确加载时,通常会出现此错误。要解决此问题,必须...
    编程 发布于2025-07-04
  • 如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    将pandas dataframe列转换为dateTime格式示例:使用column(mycol)包含以下格式的以下dataframe,以自定义格式:})指定的格式参数匹配给定的字符串格式。转换后,MyCol列现在将包含DateTime对象。 date oped filtering > = p...
    编程 发布于2025-07-04

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3