基于MOF标准的模型编辑器,提供多人协作编辑功能。模型数据最终需要以XML格式的文件进行持久化存储。
单机版模型编辑器
首先实现一个单机的模型编辑器,以此为基础进行扩展。
软件分层设计
根据功能需求,可以划分为四层:应用层-模型层-同步控制层-持久化层。
持久化层:负责实现XML文件的读写逻辑,处理文件IO和XML解析工作。
同步控制层:负责监听模型层数据变更以及处理来自应用层的操作命令,协调内存模型数据与持久化文件的双向同步。
模型层:负责管理内存中保存的模型数据,对用户层提供原子操作接口,对同步控制层实现模型数据变更通知接口。
应用层:负责提供用户交互接口,可以调用模型层操作,触发同步控制层逻辑。
关键机制设计
命令模式
应用层的操作被包装为一个个Command(命令)实例交给模型层和同步控制层执行,如模型的原子操作(增删改)、模型的保存操作等等。
模型层接收到的命令为针对模型的原子操作,模型层应当维护其接收到的命令队列。基于命令队列可以实现编辑器的Redo和Undo功能。
模型层执行命令前需进行校验操作,如果是删除操作需要检测操作节点的关联元素进行级联操作,组装成一个复合命令进行后续执行,需要注意内部子命令的执行顺序。
增量更新
触发增量更新可以是应用层的显示保存操作,也可以是自动同步定时进行。
此时模型层根据维护的命令队列,生成数据变更集,通知同步控制层进行处理并生成相应的增量更新策略(对变更集进行分析,合并相似操作,减少数据变更次数)。
持久化层根据接收的增量更新策略进行持久化。?
懒加载机制
对于大型的层次化模型数据,提供懒加载机制。仅在用户打开对应层次时才加载该层次下的模型数据。
在线编辑模式
改为在线编辑模式后,需要将原有架构拆分为客户端和服务端。客户端保留应用层,其中Command命令通过通信协议传递给服务端;服务端增加网络接口层,负责处理网络通信等工作,将接收到的Command发送给模型层。
客户端侧应保留模型数据的副本,一边能够在客户端及时响应用户的编辑操作。
用户的操作命令可以以队列形式进行管理,以一定规则批量发送给服务端进行通信,降低双端通信次数。
服务端数据持久化考虑引入关系型数据库进行管理,以提高数据管理效率,提供xml格式导出功能。
多人协同编辑模式
架构变更
引入实时通信机制:在原有的C-S架构基础上,采用WebSocket实时通信协议。服务端作为中心节点处理多客户端编辑冲突,并将编辑操作分发给其他客户端。
在多个用户同时对模型进行操作时,可能会产生冲突。服务端需要针对模型编辑的原子操作设计实现OT算法(Operational Transformation)。
OT算法
操作转换算法(Operational Transformation)是一种用于实时协同编辑的算法。通过将多个用户的操作转换为一致的操作序列,并应用之模型数据编辑,来保证多用户同时编辑文档的一致性。
假设目前存在两个客户端A、B,各自做出了操作 a1, a2 和 b1, b2 。客户端将操作发送给服务端后,服务端需要对以上操作进行转换,将转换后的操作 a1', a2' 和 b1', b2' 分别发送给客户端B、A。转换后的操作要确保操作序列 a1, a2, b1', b2' 和 b1, b2, b1', b2' 所得到的结果是一致的。