问题标签 [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 投票
7 回答
10029 浏览

scalability - 无冲突复制数据类型 (CRDT) 与 Paxos 或 Raft

什么时候使用 CRDT 之类的东西而不是 paxos 或 raft 是个好主意?

0 投票
2 回答
449 浏览

nosql - Riak 中的 G-Counters:底层 vclock 不提供相同的数据吗?

我一直在阅读CvRDT,我知道 Riak 已经在 Riak 2 中添加了一些。

gcounter我的问题是:当听起来vclock与每个对象关联的底层都记录相同的信息时,为什么 Riak 会实现 a ?结果不是用 agcounter存储vclock,每个都包含相同的基本信息吗?

我现在唯一的猜测是,Riak 可能会垃圾收集对vclocksa 的目的实际上很重要的修剪信息gcounter(即增量的数量)。

我不能很好地阅读 Erlang,所以我可能错误地认为 Riakvclocks使用这些特殊数据类型进行存储。然而,这个问题仍然适用于在标准 Riak 之上编写的本土解决方案vclocks(因此继承每个持久的对象)。

编辑:

从那以后,我写了以下文章来帮助以更实用的方式解释 CvRDT。本文还涉及我上面强调的冗余:

无冲突的复制数据类型 (CRDT) - 一种易于理解的解释,数学较少。

0 投票
0 回答
398 浏览

replication - 分布式消息传递算法?

我有一个分布式应用程序,我想在其中复制一个最终一致的状态。该数据适用于 CRDT ( http://pagesperso-systeme.lip6.fr/Marc.Shapiro/papers/RR-6956.pdf ),它具有每个节点在给定相同消息集的情况下确定性的优良特性无需复杂的共识协议即可收敛到相同的值。

但是,我需要另一个消息传递/日志层来确保每个节点都能看到每条消息,即使面对不利的网络条件也是如此。

具体来说,我正在寻找具有以下属性的算法:

  1. 在异步网络上工作。
  2. 节点只需要知道他们的邻居,而不是整个网络。
  3. 可以随时添加或删除节点(即,网络不是固定大小或拓扑)。
  4. 网络可以是非循环的(如果需要,这可能是一个要求)。
  5. 能够更新由于临时网络中断或消息丢失而落后的节点。
  6. 能够使加入集群的新空节点保持最新。
  7. 网络收敛到一个值所花费的时间没有硬性限制(即,每个节点接收每条消息),但如果没有分区,它应该相当快(用模糊的术语来说,几秒钟,不是分钟)。
  8. 大小有界。保留整个消息历史(将无限增长)的算法是不合适的。

有人知道具有这些属性的算法吗?

0 投票
1 回答
15033 浏览

algorithm - Differences between OT and CRDT

Can someone explain me simply the main differences between Operational Transform and CRDT?

As far as I understand, both are algorithms that permits data to converge without conflict on different nodes of a distributed system.

In which usecase would you use which algorithm? As far as I understand, OT is mostly used for text and CRDT is more general and can handle more advanced structures right?

Is CRDT more powerful than OT?


I ask this question because I am trying to see how to implement a collaborative editor for HTML documents, and not sure in which direction to look first. I saw the ShareJS project, and their attempts to support rich text collaboration on the browser on contenteditables elements. Nowhere in ShareJS I see any attempt to use CRDT for that.

We also know that Google Docs is using OT and it's working pretty well for real-time edition of rich documents. Is Google's choice of using OT because CRDT was not very known at that time? Or would it be a good choice today too?

I'm also interested to hear about other use cases too, like using these algorithms on databases. Riak seems to use CRDT. Can OT be used to sync nodes of a database too and be an alternative to Paxos/Zab/Raft?

0 投票
1 回答
195 浏览

java - 如何在 Riak 地图上使用二级索引

有没有办法使用 Java 客户端为 Riak 中的映射值创建二级索引?我用于创建地图的代码如下

该文档仅显示如何使用 RiakObject 类型执行此操作,这些类型具有 getIndexes 方法,您可以在其中获取特定索引并从中添加/删除值。我没有找到任何 CRDT 类型的任何东西。

0 投票
1 回答
161 浏览

akka - 在特定时间可靠地处理消息

假设我有一个聊天应用程序。

客户端向聊天室发送消息,从而向某个 Actor 发出一些命令。现在,我想立即处理他写的内容,并在此聊天中提供给其他用户,所以我处理了这个命令。同时我想告诉自己(一个演员),我需要将此消息存储在聊天历史数据库中,但不是现在。保存到数据库应该每 2 分钟发生一次。如果发生崩溃,我应该能够坚持到数据库。

我假设工作流程是这样的:

  1. 用户发送消息
  2. 聊天室参与者收到带有此消息的命令
  3. 我们将这条消息广播给每个人,并将这条消息添加到某种队列中,以将其保存到聊天历史数据库中
  4. 一些持久命令在 2 分钟超时后运行。它按照到达的顺序收集所有尚未持久化的传入聊天消息
  5. 对所有消息运行事务,然后将它们从队列中删除。
  6. 如果在 3 之后某处发生崩溃并且消息没有持久化,那么我应该尝试再次持久化它们。如果他们被坚持,我不应该再尝试坚持他们。

如何在 Akka 中构建这样的东西?我应该使用哪些功能/哪些模式?

0 投票
1 回答
81 浏览

erlang - Riak 最大计数器

我想使用 Riak 的 CRDT 来实现类似 max-counter 的东西来使用横纲。我的想法是有一张 Riak 地图,里面有两个计数器,一个要修改,另一个要在预提交挂钩中更新到两者的最大值。但是,我似乎找不到更新 Riak 地图的方法来做到这一点。有什么帮助/更好的主意吗?

0 投票
1 回答
175 浏览

erlang - 在 postcommit 钩子中处理 riak 数据类型

我想为 riak 实现一个 postcommit 钩子,它减少另一个桶中地图中的计数器。但是,我在处理 riak 数据类型时遇到了一些麻烦。

这是我尝试从riak console

product存储桶数据类型设置为map. 存储的每个对象都应该有一个quantity我想减少的计数器。

但是,我在提交前或提交后的上下文中找不到任何处理数据类型的文档或示例代码。(实际上任何类型的例子都很少)。我一直在阅读riak_clientriak_dt_map的源代码,但我是 erlang 的新手,所以我进展缓慢,希望能得到一些帮助。

0 投票
1 回答
136 浏览

scala - Riak Datatypes:默认值与不存在的键

Riak Datatype API 似乎不允许区分不存在的键和默认值。例如,如果我按如下方式查询不存在的键:

我会得到一个保持 0 的计数器。现在,如果我将值为 0 的计数器放在这个键上并运行查询,我会得到相同的结果。有没有办法区分这两种不同的状态?

注意:使用集合时,我可以检查一个上下文。如果我获取一个集合并且上下文为空,则意味着该集合在此键下不存在。但是,此技巧不适用于计数器,因为它们不维护上下文。

更新:德米特里的以下建议导致以下解决方案:

但是,缺点是现在我需要进行额外的查询。

0 投票
3 回答
7570 浏览

distributed-computing - 什么是分布式系统中的 CRDT?

我是分布式系统的新手,我正在尝试深入了解 CRDT 的概念。我意识到它有三个符号:

谁能举一个我们在分布式系统中使用 CRDT 的例子吗?提前非常感谢。