问题标签 [crdt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
92 浏览

reactjs - 用于协作文本编辑的 IPFS

我是 ReactJS 和 IPFS 的新手,试图用 textarea 创建网页,当我输入网页 1 的 textarea 时,它应该反映在另一个上,反之亦然。另外,我需要用 ipfs 来做这件事。任何有助于理解如何进行此操作。我尝试安装 yjs、http-server 和 ipfs。使用 textarea 绑定,但无法复制。帮助我了解如何实现这一目标。

0 投票
0 回答
409 浏览

algorithm - 有没有办法将 OT 或 CRDT(或类似的东西)用于关系数据?

我正在研究离线优先数据库和中央服务器之间的同步过程。举个简单的例子,有项目和部门,一个项目属于一个部门。每个客户端都可以修改任何实体。

我知道对于文本文档,有一些算法/技术可以处理 OT 和 CRDT 等冲突:

但是我想知道您是否可以将这些用于更复杂的结构,例如数据库中的结构。就我而言,让我们保持简单并说您有:

  • 项目 - id、名称、department_id
  • 部门 - id,名称

单个元素中的“名称”等属性的更改是可管理的(可能使用版本、增量、时间戳)。删除有点小技巧,但您可能会丢弃名称更改,因为元素已被删除。

当有关系时,它就更加棘手了。当一个客户将项目移动到一个部门而另一个客户删除该部门时会发生什么。

在一定程度上,其中一些冲突类似于使用 OT 的文本中可能发生的冲突。有人更改标题,其他人将其删除。或者有人将一个元素添加到项目符号列表中,而其他人将该列表移动到文档的不同部分。

我的问题是,您可以将 OT 或 CRDT 用于关系数据吗?如果可以,您会怎么做?如果没有,是否还有其他类似的算法或技术来处理关系数据中的冲突?

0 投票
1 回答
290 浏览

gun - 如何使用 Gun 实现无损 CRDT?

如何使用 Gun 创建 CRDT?

例如,如果我想实现一个只增长的数组,其中每个元素都指向下一个元素,我该如何解决冲突?

为简化起见,让我们创建一个 Alice 和 Bob 合作的场景。

该数组包含 3 个元素,[a, b, d].

这个数组的内部表示将是一个像这样的链表:

(当然,内部表示形式类似于{value: 'a', next: { value: 'b' next: { value: 'c' }}}),但我认为您使用更简洁的表示法理解了我的观点。

Alice 现在想在和c之间插入元素。bd

同时,Bob 想要在和C之间插入元素。bd

同时,它们具有数组的这种内部表示:

爱丽丝:a => b => c => d

鲍勃:a => b => C => d

当他们加入 CRDT 时,他们将收敛到以下值之一:

a => b => c => C => d

或者

a => b => C => c => d

无论如何,a)它们都将收敛于相同的值,并且 b)它们不会丢失彼此的数据。

我们可以使用 Gun 来实现这一点吗?

(这个问题是对https://github.com/amark/gun/issues/602的简化和后续问题)

0 投票
1 回答
270 浏览

algorithm - 我可以使用 Unix 时间作为 Lamport 时间戳吗?

据我所知,lamport 时间戳是一种用于确保跨多个站点的事件具有部分排序的工具。

来自维基百科

在伪代码中,发送算法是:

接收消息的算法是:

时间戳是否可能是 unix 时间戳,它会根据时间而不是事件自动递增?如果每个站点都使用 unix 时间戳,这是否意味着事件仍然在本地部分排序?我是否必须更改/省略接收消息的算法,还是完全使用 unix 时间戳是错误的?

0 投票
1 回答
187 浏览

data-structures - 使用 2P CRDT 数据结构(例如 2P-set)时,如何释放空间?

2P-set 允许从集合中移除元素,但不允许释放那些移除的元素占用的空间。事实上,删除一个元素会消耗空间,而不是释放它。为 2P 结构释放空间的算法是什么?

我试图了解在实践中我可以使用 CRDT 结构解决哪些问题。如果没有释放空间的方法,2P CRDT 结构在现实世界任务中的用途似乎非常有限。

0 投票
1 回答
141 浏览

crdt - 为什么 G-Counter 不能做减法运算?

我读过一些关于 CRDT 的文章。并且知道G-Counter是 CvRDT 的一个实现。它只能做递增操作。但是,算法中的每个节点都有自己的槽。如果将其转换为 CmRDT 并且每个节点都广播其操作而不是整个状态,那么 G-Counter 可以递减吗?为什么或者为什么不?

0 投票
0 回答
693 浏览

c++ - C++“未知类型名称”和“使用未声明的标识符”错误

我正在为一个学校项目编写一个模拟共享编辑器(如 Google Docs)的小程序

我已经编写了我需要的所有类,但是当我尝试构建程序时,我得到了这个错误:

error: unknown type name 'NetworkServer' NetworkServer &_server;

error: use of undeclared identifier 'SharedEditor' std::vector<SharedEditor*> SEditors;

error: expected expression std::vector<SharedEditor*> SEditors;

error: unknown type name 'SharedEditor' int connect(SharedEditor* sharedEditor);

这是我的 .h 文件

网络服务器.h

共享编辑器.h

符号.h

消息.h

我不明白我在哪里做错了。顺便说一句,我正在使用 CLion

0 投票
0 回答
46 浏览

crdt - 如何在 delta-crdt 中管理和保持 delta-state 的大小最小

我对(delta)crdt很陌生。据我了解,delta crdt 保持“全局”(最终一致)状态和 delta 状态。它偶尔会将增量部分(有时是完整状态)发送到其他副本。当所有副本都看到更改时,其他一些 crdt 算法可以垃圾收集墓碑。我的问题是,是否有可能(并且是否有意义)合并这两件事?

  • 保持增量是本地增量和从其他副本接收到的增量的联合
  • 将合并的增量发送到一些副本
  • 在接收 delta 时,它也会合并到 global 和 delta 状态。如果所有副本都看到了操作,则清除墓碑。

一些文章:

我的理论是,副本将发送较小的增量而不是整个状态,因此带宽要求是有限的,并且墓碑的大小(以及内存要求)也将受到限制。有没有关于 delta-crdt 和 tombstone 垃圾收集的好教程?我读过一些原始文章,它们并不那么容易理解。

我也找不到太多关于如何将增量发送到副本的细节。(将所有 delta 发送到所有副本似乎有点矫枉过正,而且不是太理想)。我的基本想法是保留副本之间连接的拓扑(crdt)图。在增量传播期间,此图用于构建一些“最佳”拓扑,其中每个副本发送到(最多 2 个)其他副本。如果图拓扑显示某些副本处于非活动状态,则其他副本会尝试找到到非活动副本的“新路线”。它可以将副本标记为已断开连接。当一个副本出现时,它可以从某个其他副本获得完整状态,并使其成为这个“有机”最终一致拓扑图的一部分。

所以我很新,欢迎提供任何介绍性信息。

谢谢,gzp

0 投票
1 回答
697 浏览

javascript - 如何初始化 CodeMirror 绑定到 yjs 的值?

我的主要问题是在我的网站上初始化代码编辑器(CodeMirror)的文本/值,而不影响我将 POST 请求保存/发送到后端的方式。以下是我用于 POST 请求的哈巴狗代码:

我在这里尝试做的是将 docs.content 发送到 id 为“content”的 textarea,以便我可以使用它来初始化代码编辑器的值,然后将代码编辑器中的内容放在 textarea 中“ editortext" 一旦我点击提交按钮。因此,POST 请求将从两个文本区域中获取数据,然后我可以将“editortext”文本区域的内容保存到我的数据库中。代码编辑器的逻辑在同一个 pug 文件中引用到汇总编译后的 javascript 文件。以下是一段预编译的代码:

除了内容变量的声明、setValue 方法的调用和 document.getElementById("form") 块之外,大部分代码都来自 yjs-codemirror 演示。该代码当前所做的是将正确的信息发送到我的数据库。但是,当我打开文档时,我无法初始化代码编辑器的值。setValue 方法不起作用,以下操作也不起作用:

即使我用一些字符串替换内容变量,所有前面的示例都失败了。唯一似乎有效的是:

但是,问题是由于某种原因,我在控制台浏览器中收到以下错误:

作为参考,我在这个问题中展示的 javascript 全部来自 index.js 文件。无论如何,由于编辑器未定义,我无法再将“editortext”文本区域的值设置为 CodeMirror 文本区域,也无法将写入代码编辑器的内容保存到我的数据库中。我不确定为什么会发生这种情况,我不确定这是否是 yjs 的 CodeMirrorBinding 所特有的,但对此的任何帮助将不胜感激。

0 投票
1 回答
447 浏览

mongodb - 允许自定义 CRDT 合并的分布式数据库

我对分布式数据库相当陌生,尽管我已经研究了相关文献(例如 CAP 定理、CRDT)并实现了一些 POC 以允许水平扩展我的应用程序。

然而,现在我面临一个具有挑战性的问题。为了水平扩展应用程序,服务之间的通信是通过分布式队列完成的。作为这里的背景,我确实需要一个自定义 CRDT 方法来保持数据最终一致,并且我确实需要我的应用程序像缓存一样工作(与 REDIS 远程相关)。

现在的挑战是我还需要持久化数据。这要求我使应用程序缓存和数据库中的数据最终保持一致。我检查了 Cassandra,我看到了一张票 [1],有人试图为自定义 CRDT 合并功能添加功能(正如我提到的那样,这是有原因的)。这从未进入 Cassandra,并且似乎有一些问题需要解决。

我的选择是什么,要么是允许自定义合并的具体分布式数据库引擎,要么是可以帮助解决问题的算法(例如,以数据库触发器或类似的形式)。

[1] https://issues.apache.org/jira/browse/CASSANDRA-6412