问题标签 [operational-transform]
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.
meteor - Meteor 中使用的并发控制技术是什么
我对 Meteor 很陌生,但我觉得它很有趣。
我只是想知道 Meteor 用于实时进行并发控制的底层技术或算法是什么,以及它如何处理冲突?它是基于运营转型 (OT) 还是其他?此外,了解 Meteor 的架构也会有所帮助。
node.js - 如何将 shareJS 的文档与文件系统同步
我正在尝试创建一个具有 Operational Transform 多租户支持的简单文本编辑器,虽然使用 shareJS 让编辑器在客户端之间工作和同步相当容易,但我的问题是我想将 shareJS doc与 Folder同步服务器端的结构(这最终将是一个 git repo)
我对sharejs和 Operational Transforms 完全陌生,发现 shareJS 文档对于更复杂的示例有点难以理解。
关于如何解决这个问题的任何建议?
我试图做的是在服务器端实现一个客户端,它可以在更新时获取整个文档文本,但是(我敢肯定这是缺乏经验)我能想到的唯一方法是使用客户端 api 循环浏览所有文档并将每个文档写入文件。但对我来说,这听起来非常低效。任何人都可以向我指出任何可能有帮助的资源或就我如何解决这个问题提供一些建议吗?
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?
javascript - 具有离线支持的客户端服务器同步
我正在尝试做的是在服务器的帮助下在客户端同步 json 对象。当客户端无法连接到服务器时,它应该回退到本地存储的最新对象的备份。
我已经为此尝试过 ShareJS,但到目前为止我还无法真正连接到服务器。据我了解,所有示例都是工作服务器端。
如何使用不同的客户端(通过身份验证)连接到远程 ShareJS 服务器?
或者也许有比 ShareJS 更好的解决方案?
microsoft-sync-framework - 同步框架:如何在同一应用程序的多个实例中使用/同步单个数据(文件)
目前我们有一个应用程序(图表编辑器),它能够在 xml 文件中保存和加载(序列化)其状态。
现在我们希望此应用程序的行为类似于 Microsoft OneNote 应用程序。多个用户可以访问同一个文件。
稍后我们可能还需要增强其他内容,例如(1)更改了什么以及谁更改了它,(2)解决冲突的选项(如果有)。
我开始了解同步框架来解决这个问题。到目前为止,我还没有尝试过。
我想要的只是,
- 几乎单个文件应该由同一应用程序的多个实例编辑。
我们需要一个执行以下操作的 dll(同步框架)
- 它完全负责文件处理。
- 使用这个 dll,应用程序的每个实例都会通知它们自己的更改。
- 应用程序的每个实例都应该能够检测最近所做的更改(何时、谁、什么是更改)。
我的问题:
- 同步框架是否适合此要求?
- 如果是这样,是否有代表此的演示应用程序?
algorithm - Google Docs 如何处理编辑冲突?
我一直在尝试编写自己的 Javascript 编辑器,其功能类似于 Google Docs(允许多人同时处理)。我不明白的一件事:
假设您已经让用户 A 和用户 B 直接相互连接,网络延迟为 10 毫秒。我假设编辑器使用差异系统(正如我理解 Docs 所做的那样),其中编辑表示为“在索引 3 处插入'文本'”,并且差异带有时间戳并强制由所有客户端按时间顺序应用。
让我们从包含以下文本的文档开始:“xyz123”
用户 A 在文档开头的时间戳 001ms 处键入“abc”,而用户 B 在时间戳 005ms 处在“xyz”和“123”之间键入“hello”。
两个用户都希望结果是:“abcxyzhello123”,但是,考虑到网络延迟:
- 用户 B 将在 011 毫秒时收到用户 A 对“在索引 0 处插入 'abc'”的编辑。为了保持时间顺序,用户 B 将撤消用户 B 在索引 3 处的插入,在索引 0 处插入用户 A 的“abc”,然后在索引 3 处重新插入用户 B 的插入,现在位于“abc”和“xyz”之间”,因此给出“abchelloxyz123”
- 用户 A 将在 015 毫秒时收到用户 B 对“在索引 3 处插入 'hello'”的编辑。它将识别出用户 B 的插入是在用户 A 之后完成的,并且只需在索引 3 处插入“hello”(现在在“abc”和“xyz”之间),给出“abchelloxyz123”
当然,“ abchello xyz123”与“ abc xyz hello 123”不一样
除了从字面上为每个字符分配自己的唯一 ID 之外,我无法想象 Google 将如何有效地解决这个问题。
我想到的一些可能性:
- 跟踪插入点而不是发送带有差异的索引会起作用,但如果用户 B 在编辑前 1 毫秒移动了他的插入点,则会遇到完全相同的问题。
- 您可以让用户 B 发送一些带有他的差异的信息,例如“在 'xyz' 之后插入”,以便用户 A 可以智能地识别这已经发生,但是如果用户 A 插入文本“xyz”怎么办?
- 用户 B 可以识别这已经发生(当它接收到用户 A 的 diff 并看到它是冲突时),然后发送一个 diff 撤消用户 B 的编辑和一个插入用户 B 的 "hello" "abc".length 索引的新 diff正确的。这样做的问题是(1)用户 A 会在文本中看到“跳转”,并且(2)如果用户 A 继续编辑,那么用户 B 将不得不不断修复其差异 - 即使“修复器”差异也会关闭并需要修复,成倍增加复杂性。
- 用户 B 可以连同它的 diff 一起发送一个属性,它收到的最后一个时间戳 diff 是 -005ms 或其他东西,然后 A 可以识别 B 不知道它的变化(因为 A 的 diff 是在 001ms)然后进行冲突解决。问题是(1)考虑到大多数计算机时钟不精确到毫秒,所有用户的时间戳都会略有偏差;(2)如果有第三个用户 C 与用户 A 有 25 毫秒的延迟,但与用户 B 有 2 毫秒的延迟,并且用户 C 在 -003ms 在“x”和“y”之间添加了一些文本,然后用户 B 将使用用户 C 的编辑作为参考点,但用户 A 不知道用户 C 的编辑(因此用户 B 的参考点)直到 22 毫秒。我相信如果您使用通用服务器为所有编辑添加时间戳,则可以解决此问题,但这似乎相当复杂。
- 您可以给每个角色一个唯一的 ID,然后使用这些 ID 而不是索引,但这似乎有点矫枉过正......
我正在阅读http://www.waveprotocol.org/whitepapers/operational-transform,但很想听听解决此问题的所有方法。
collaboration - 操作转换如何处理断开的连接?
假设客户端发送insert(0, "A")
,但连接中断,没有收到响应。客户端可以重新连接。
如果客户端丢弃了未完成的更改,那么如果服务器没有收到它,它将丢失。
如果客户端重新传输未完成的更改,那么如果服务器确实收到了它,它将被复制。
操作转换是否解决了如何处理这种情况?
javascript - 如何在移动设备上实现类似 google doc 的应用程序?
我目前正在从事类似于 google docs 的项目。基本上,它允许多个用户在 Web 浏览器中同时编辑 Word 文档。我一直在纯 javascript nodejs 和 socket.io 中广泛工作。基于 Web 的文本编辑器是使用 HTML5、CSS 和 Javascript 从头开始编写的。我使用 shareJS(允许实时编辑的服务器和客户端库)处理操作转换(OT)。
我现在面临的挑战是移动开发,我通常希望同时为 android 和 iOS 进行开发。我一直不确定要做出正确的工作流程和技术决策。以下是我一直在想的:
如何将我的 javascript 应用程序合并到本机 iOS/Android 应用程序中?我是否应该从头开始构建我在网络上的内容的精确克隆?我的意思是在 iOS(Swift)/Android(Java) 中构建我的 Web 实现的副本。当然,这意味着用母语从头开始重写我的文本编辑器和 OT 脚本。那有意义吗?
我知道 NativeScript 和 phonegap。但是,当谈到移动设备时,我更喜欢倾向于母语。有没有办法将我的 javascript 包装到 Swift/Android 中以调用我的 javascript 函数?
几个星期以来一直在思考这个问题,思考如何解决这个问题。我认为我需要其他参考框架的建议、想法和建议。提前致谢
collaboration - 如何在 Quill 中显示远程用户的光标和选择
我与Quill合作了很短的时间,一直专注于让协作编辑工作。到目前为止一切顺利,我有一个完全可以工作的协作编辑器!
我想显示其他用户的选择和光标位置,但我想不出如何用 Quill 正确解决这个问题。
我本质上想向呈现的文档添加标记,而不向实际的文档模型添加任何内容。这可能吗?我应该从哪里开始?
javascript - 服务器端 Javascript 与 Python 的集成
我正在构建一个 Web 应用程序,它使用 JSON 数组在服务器和客户端之间保存和传输状态,反之亦然。我正在尝试为其添加“协作”功能,以便多个客户端可以同时编辑 json 数据而不会引起冲突,并且数据会在所有客户端上实时更新。
在后端我使用 python,所以我很高兴找到opencoweb项目,遗憾的是它不再被维护。同样,我发现了 ShareDB,它看起来是一个非常整洁的项目!我想从我的 Python 代码在我的服务器端启动 ShareDB,但我不确定运行 javascript 代码服务器端的最佳方法是什么。此时,我正在考虑从命令行使用 node 运行它,但想知道使用允许运行 javascript(Js2Py 或类似的东西)的 python 库是否更有意义。所以这让我想到了我的问题,在服务器端,当你的主框架使用 python (tornado) 时,是否有一种“推荐”的方法来将 javascript 集成到你的服务器端代码库中?