📜  项目理念 |实时协作编辑器框架

📅  最后修改于: 2022-05-13 01:57:40.791000             🧑  作者: Mango

项目理念 |实时协作编辑器框架

注意:大部分内容取自项目报告。因此您也可以从下拉框中下载它,链接在(以下可能还提供其他主题)块中给出。简单地你可以读出来。

实时协作编辑器框架

介绍:

协作编辑器是协作软件应用程序的一种形式,它允许多人通过计算机网络协作编辑文档或程序。在实时协同编辑中,用户可以同时编辑同一个文件,而在非实时协同编辑中,用户不会同时编辑同一个文件。由于在任何时候实现协同编辑的开源解决方案都非常少。 Web 应用程序,我们打算用 JavaScript 开发一个框架,任何人都可以通过它轻松实现此功能。为了解决这种协作编辑框架中的并发问题,我们将使用操作转换。

此外,为了改进传统方法,我们将考虑使用文本的分层表示而不是线性表示。实时操作是协同编辑器设计中需要考虑的一个重要方面,因为用户应该能够看到立即影响他们自己和其他用户的行为。我们将通过网络套接字实现这一点

协同编辑中的并发问题是一个研究得很好的问题。人们建议轮流算法(Greenberg,1991)一次只允许一个积极的参与者。这种算法缺乏并发性并锁定文档。

其他方法,如锁定(Greenberg 和 Marwood,1994)保证用户一次访问共享工作空间中的对象。仅当用户锁定和编辑不同的对象时才允许并发编辑。
操作转换方法已被确定为在实时协作编辑系统中保持共享文档副本一致性的适当方法

Google Wave,一种实时协作工具,过去几个月一直处于公开测试阶段。

treeOPT 算法(Ignat 和 Norrie,2003 年)通过在他们的研究论文中考虑共享文档的层次表示来改进操作转换。 [2]据称,与传统方法相比,该方法提高了运营转型的效率。

概念框架:

方法
为了确保高响应性,我们将使用复制架构,用户将在自己的共享文档副本上工作。只有所做的更改才会传输给其他用户。
这是这种架构的控制流程:

  • 每个协作者将与服务器一起持有共享文档的副本。
  • 每当编辑任何共享副本时,都会计算操作并将其传输到服务器。为了确保实时传输,我们将利用网络套接字的力量。
  • 如果不同的用户更新同一文档的不同部分,服务器会将更改应用到其副本并将更改转发给其他协作者。
  • 如果不同的用户尝试更新文档的同一部分(例如尝试将字符串添加到同一位置),即发生并发,服务器将需要解决竞争条件,并且其中一个协作者将能够提交其更改.
  • 现在真正的问题开始了。服务器的文档副本和其他客户端的副本已经分道扬镳。

上面的服务器副本和客户端副本分叉的问题可以通过这张图来表现。假设服务器对文档应用了操作 b,而客户端对文档应用了操作 a。这导致两个副本彼此“分歧”。为了解决问题,或者将两个副本“融合”到相同的版本,我们将使用操作转换。

操作转换调整操作 a 相对于 b 和操作 b 相对于 a。最终结果必须是调整后的操作导致分散的副本收敛。这在数学上可以写成:

OT(a, b) = (a', b') such that:
apply(apply(str, a), b') = apply(apply(str, b) 

换句话说,转换函数需要两个操作,一个服务器和一个客户端,并产生一对操作。这些操作可以应用于它们对应的最终状态,以在完成时产生完全相同的状态。如图 2 所示,在将操作 b' 应用于客户端的副本并将操作 a' 应用于服务器的副本之后,它们现在处于相同状态。
对文本的线性表示使用操作转换不是很有效。为了提高性能,我们将使用 treeOPT 算法的方法。我们将按层次顺序表示文本

对文本的线性表示使用操作转换不是很有效。为了提高性能,我们将使用 treeOPT 算法的方法。我们将按层次顺序表示文本。

在这种分层表示中,每个节点都有自己的历史。操作转换现在可以应用于各个节点而不是整个文档。这减少了浏览整个文本历史的开销,因为现在我们只需要浏览各个节点的历史。

数据结构和算法

树操作变换算法

定义

Node : A node N is a structure of the form N =, where   
Level: is a granularity level, level?{0, 1, 2, 3, 4},
corresponding to the element type represented by node 
(i.e. document, paragraph, sentence, word or character)   
Children: is an ordered list of nodes 
{child1, ..., childn},   level(childi)=level+1, for all i?{1, ..., n}  
Length : is the length of the node,
 
Length = {1, if level = 4 
         ? length(childi), otherwise 
         }
 
History: is an ordered list of already executed operations on children nodes  
Content: is the content of the node, defined only for leaf nodes  

Content = { undefined,  if level < 4 
           aCharacter, if level = 4 
           } 
Composite Operation:  A composite operation 
is a structure of the form cOp=, where: - 
Level: is a granularity level, level?{1, 2, 3, 4}  
Type:  is the type of the operation, type?{Insertion, Deletion}  
Position:  is a vector of positions   
position[i]= position for the ith    granularity level,  i?{1, ..., level}
- content is a node representing the content of the operation   
StateVector: is the state vector of the generating site 
Initiator: is the initiator site identifier.

给定一个新的因果就绪复合操作cOp,文档本地副本的层次表示的根节点rootNode,以及文档层次结构中的层数noLevels,返回cOp的执行形式。

treeOPT(rootNode, cOp, noLevels) { 
currentNode = rootNode;  
for (l = 1; l <= noLevels; l++)   
onew = Composite2Simple(cOp, l); 
eonew = Transform(onew, history(currentNode)); 
position(cOp)[l] = position(eonew);  
if (level(cOp) = l)      
return cOp;   
           currentNode = childi(currentNode), where i=position(eonew);  
}  
 

客户端 - 服务器通信协议

为了确保将操作从一个客户端快速传输到另一个客户端,我们在客户端和服务器之间使用了 websocket。
为了避免重复地轮询数据库,我们使用了 mongoDB,它允许我们订阅数据库表的实时提要。
客户端是使用Java制作的,服务器是基于 nodejs 的。服务器工作

$ node www { address: '0.0.0.0',  family :  'IPv4',  port: 3000  } 

客户端请求服务器共享文件,现在服务器将通过 MongoDB 中存在的 FileID 共享文件。然后,它使用会话管理器将用户添加到请求的客户端的会话中,也可以从中删除用户。
每当客户端进行更改时,操作都会发送到历史记录集合,客户端等待服务器的确认。
如果客户端有进一步的更改,它们将存储在缓冲区中,直到服务器的确认到来。一旦服务器确认,缓冲区中的所有更改都会发送。

使用的工具:

    • Node.js:它是基于 chrome 的 V8 JavaScript 引擎构建的 JavaScript 运行时。 Node.js 使用事件驱动的非阻塞 I/O 模型,使其高效。
    • MongoDB:是一个免费和开源的跨平台的面向文档的数据库程序。 MongoDB 被归类为 NoSQL 数据库程序,它使用带有模式的类似 JSON 的文档。
    • JavaFx:用于制作客户端 GUI。
    • Robomongo:是一个以 shell 为中心的跨平台 MongoDB 管理工具。与大多数其他 MongoDB 管理 UI 工具不同,Robomongo 将实际的 mongo shell 嵌入到选项卡式界面中,可以访问 shell 命令行和 GUI 交互。

应用:
实时协作集成开发环境可以为开发人员提供通过网络就软件项目进行协作的设施,即使开发人员在千里之外。实时协作 IDE 为开发人员提供了协作编写代码、构建和测试代码以及与其他开发人员共享项目的能力。也可以就项目与其他开发人员聊天。除了完整 IDE 的其他几个有用功能(包括保存快照)外,还提供项目管理以简化整个项目开发过程。

还可以提供以下附加主题:
1) Github – https://github.com/agnu13/Collaborative-Editor-client
运行项目的所有描述都在 github 存储库中给出

2)项目报告和介绍——项目文件

3)基础论文——TreeOPT 算法:基于 treeOPT 算法的可定制协作编辑器(Ignat 和 Norrie,2003)

参考

      • 图片: [1]。来自在线资源的服务器和客户端副本的分歧:http: Java

引文:

    • [1].协作编辑器简介。来自维基百科:https://en.wikipedia.org/wiki/Collaborative_real-time_editor
    • [2].支持树表示,摘自关于treeOPT算法的研究论文:基于treeOPT算法的可定制的协作编辑器(Ignat和Norrie,2003)
    • [3].基本OT的解释,摘自网上来源:http: Java