有人可以简单解释一下Operational Transform和CRDT之间的主要区别吗?
据我所知,这两种算法都允许数据在分布式系统的不同节点上收敛而不会发生冲突.
在哪个用例中你会使用哪种算法?据我所知,OT主要用于文本,CRDT更通用,可以处理更高级的结构吗?
CRDT比OT更强大吗?
我问这个问题是因为我试图了解如何为HTML文档实现协作编辑器,并且不确定首先查看哪个方向.我看到了ShareJS项目,以及他们尝试在contenteditables元素上的浏览器上支持富文本协作.在ShareJS中我没有看到任何使用CRDT的尝试.
我们也知道Google Docs正在使用OT,它在富文档的实时版本中运行良好.谷歌是否选择使用OT,因为CRDT当时并不为人所知?或者它今天也是一个不错的选择?
我也有兴趣了解其他用例,比如在数据库上使用这些算法.Riak似乎使用CRDT.OT也可用于同步数据库的节点,是Paxos/Zab/Raft的替代品吗?
什么时候使用像CRDT而不是paxos或筏这样的东西是个好主意?
我是分布式系统的新手,我正在尝试深入了解CRDT的概念.我意识到它有三个符号:
Conflict-free Replicated Data Type
Convergent Replicated Data Type
Commutative Replicated Data Type
Run Code Online (Sandbox Code Playgroud)
任何人都可以举例说明我们在分布式系统中使用CRDT吗?非常感谢提前.
我想实现Logoot最终收敛的P2P文本编辑,我遇到了一些问题.
我对Logoot的理解是,对象之间的间隔(原始文件中的文本行,但可以是字符或单词)可以根据无界标识符无限划分.这意味着对象的位置不是由其邻居确定的,如在WOOT中(这将需要墓碑),而是由沿着字符串长度的固定数字点确定.结合唯一的站点标识符,这也为我们提供了一个总订单,并实现了最终的融合.
但是......当对同一个点进行并发编辑时,这不会导致问题吗?如果两个断开连接的客户端开始在相同的光标位置写入新的句子然后合并,则他们的句子很有可能进行交错.
下面是我正在谈论的白板示例:
如您所见,站点B和站点C根据Logoot的规则划分"I"和"conquered"之间的间隔,给出了(20,A)和(25,A)位置之间的随机点.但是没有任何东西相对于彼此命令这些点,导致它们在合并时混合.同时,基于邻居的算法可以解决这个问题,因为保留了每个对象的因果链.
以上是一个婴儿示例,但在更一般的情况下,想象一下,如果两个用户想要在两个现有句子之间插入不同的句子.如果其中一个用户碰巧离线,他们不应该回到乱七八糟的混乱!显然,为了保持意图,一句话应该跟随另一句话.
我在阅读论文时遗漏了什么,或者这是Logoot的内在缺点?
(另外,为什么在算法中似乎没有使用记录的时钟值?本文甚至指出每个对象的标识符在没有时钟的情况下必然是唯一的.)
我遇到过 CRDT,并且对它们的潜力感到兴奋,但我担心它与我所知道的数据库不能很好地配合。每当我必须更新数据库状态时,我仍然需要在写入数据之前进行某种锁定(无论是悲观锁定还是乐观锁定)。除非有一个数据库接受 CRDT、OT 或某种补丁集作为其 DSL 的一部分,并且在内部处理并发?有这样的数据库吗?
\n我们假设我有一个聊天应用程序.
客户端向聊天发送消息,导致某些Actor的某些命令.现在,我想立即处理他写的内容,并在此聊天中将其提供给其他用户,因此我处理此命令.同时我想告诉自己(一个演员)我需要在聊天记录数据库中存储此消息但不是现在.保存到数据库应该每2分钟发生一次.如果发生崩溃,我应该能够坚持到数据库.
我假设工作流程是这样的:
如何在Akka中构建这样的东西?我应该使用哪些功能/哪种模式?
以多人网络游戏的用例为例。您立即就会遇到在网络上复制和协调共享状态的问题。
似乎有多种工具针对此问题的某个方面,其中两个工具似乎有重叠:
我的问题是:CRDT 和 RAFT 协议之间是否存在关系——或者它们是正交的?
distributed-computing distributed-system shared-state raft crdt
我在配置CRDT桶类型和使用bitcask后端时遇到问题.我希望能够使用set类型并保持bitcask的到期功能.
如果我没有指定后端,我可以创建和使用桶类型
sudo riak-admin bucket-type create sets '{"props":{"datatype":"set"}}'
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试在道具中指定后端,每当我尝试使用该类型时,riak似乎崩溃了,我失去了联系.
sudo riak-admin bucket-type create sets2 '{"props":{"datatype":"set","backend":"bitcask"}}'
Run Code Online (Sandbox Code Playgroud)
以下是我尝试使用存储桶类型时error.log中的唯一日志.如果它有帮助我也尝试指定后端是leveldb和内存以及bitcask没有运气.
2016-10-13 13:41:25.965 [错误] <0.8870.0> gen_fsm <0.8870.0>状态有效终止,原因是:在riak_core_vnode中没有匹配{riak_kv_multi_backend,undefined_backend,<<"bitcask">>}的case子句:vnode_command/3 line 346 2016-10-13 13:41:25.965 [error] <0.8870.0> CRASH REPORT进程<0.8870.0>退出1个邻居,原因是:没有case子句匹配{riak_kv_multi_backend,undefined_backend,<< riak_core_vnode中的"bitcask">>}:gen_fsm中的vnode_command/3行346:终止/ 7行622 2016-10-13 13:41:25.965 [错误] <0.168.0>主管riak_core_vnode_sup以{riak_core_vnode开头的子项未定义start_link,undefined} at <0.8870.0>退出,原因是没有case子句匹配riak_core_vnode中的{riak_kv_multi_backend,undefined_backend,<<"bitcask">>}:vnode_command/3 line 346 in context child_terminated 2016-10-13 13:41: 25.965 [错误] <0.8896.0> gen_fsm <0.8896.0>处于状态就绪已终止,原因是:没有case子句匹配{riak_kv_multi_backend,undefined_backend,<<"bitcask" >>} in riak_core_vnode:vnode_command/3 line 346 2016-10-13 13:41:25.965 [error] <0.8896.0> CRASH REPORT进程<0.8896.0>退出10个邻居,原因是:没有case子句匹配{riak_kv_multi_backend ,undefined_backend,<<"bitcask">>} in riak_core_vnode:vnode_command/3 line 346 in gen_fsm:terminate/7 line 622 2016-10-13 13:41:25.966 [error] <0.8897.0> Supervisor {<0.8897. 0>,poolboy_sup}让孩子riak_core_vnode_worker以riak_core_vnode_worker:start_link([{worker_module,riak_core_vnode_worker},{worker_args,[1370157784997721485815954530671515330927436759040,...]},...])在未定义的出口处启动,原因是没有case子句匹配{riak_kv_multi_backend, undefined_backend,<<"bitcask">>}在riak_core_vnode中:vnode_command/3行346在上下文中shutdown_error 2016-10-13 13:41:25.966 …
crdt ×8
algorithm ×2
nosql ×2
paxos ×2
raft ×2
akka ×1
cap-theorem ×1
concurrency ×1
convergence ×1
database ×1
distributed ×1
erlang ×1
riak ×1
scalability ×1
shared-state ×1
text-editor ×1