Univer 协同引擎性能测试

引言

在当今快节奏的商业环境中,实时协作编辑已成为现代生产力应用不可或缺的核心功能。它让远程团队能够高效协作,共同完成创作和编辑任务。本报告深入评估了 Univer 协同引擎在处理多人实时协作编辑时的性能表现,并将其与市场上其他领先产品进行对比。

Real-time Collaborative Editors Performance.pdf

A Research for real-time collaborative editor performances.

在这篇论文中,提出了市场上流行的实时编辑服务中延迟性能测量。提出了协同编辑人数是影响实时编辑系统性能的主要因素,以下是主流实时编辑产品表现:

Office 365 腾讯文档 石墨文档 Google Sheet 飞书表格
协同编辑人数上限 365 200 200 200 200

注:上述数据截止于 2022 年。

Univer GitHub 地址:github.com/dream-num/u...

介绍 Univer 协同引擎

为了更好理解测试过程,让我们简要介绍一下 Univer 协同引擎的实现方案。

Univer 协同引擎非常注重扩展性,已支持分布式方案。但为便于叙述,我们将暂时采用单机部署方案来描述。

Univer 协同引擎主要使用两种编程语言:Golang 和 JavaScript。

  • Golang 擅长处理高并发和快速网络 I/O,使 Univer 协作引擎能够轻松处理大量客户端连接请求;
  • JavaScript(Node.js)使得后端与前端之间的代码共享变得容易,并极大减少了处理冲突错误的可能性。同时也为未来服务器端计算和渲染奠定了重要基础。

Univer 使用 OT(操作转换)作为协同冲突处理的方案。

为了加快单个请求处理速度,协同引擎被设计为有状态服务,即每篇活跃文档在内存中都有一份最新的拷贝,客户端的编辑请求会迅速应用和写入。

有状态服务 Collaboration-server 采用 Node.js 实现,与前端编辑器共享相同的冲突处理代码,包括两个核心方法:

  • Transform:实施表格或文档的 OT 算法,对 changeset 进行操作转换;
  • Apply:将转换后的 changeset 应用到表格/文档。

无状态服务 Universer 使用 Golang 实现,主要负责调度和网络

  • Comb:基于 WebSocket 实现房间服务,用于广播和分发协同事件;
  • Snapshot:基于 EventSourcing 模式提供文档快照服务,并高效还原任意版本文档。

以下是用户编辑事件如何被协同引擎处理的过程:

changeset 指的用户编辑后产生的一组变更,通常简称为 cs

性能测试

为全面评估 Univer 协同引擎的性能,我们精心设计了一系列测试,涵盖了关键指标和典型场景。

为方便叙述,介绍几个关键术语:

通俗讲,衡量协同体验最直接的指标是,A 的编辑多久后被 B 应用并展示。

这个过程涉及的变量很多,为简化压测过程,这里提取最关键的变量,并称为"协同延迟"。

协同延迟能有效地衡量 CS 的 transform, apply 的性能。

在当前协同引擎模型下,影响协同延迟的直接因素为 CS 的处理数量,不妨称为 协同并发数。

测试环境:

  • ECS 配置为 4 核 8GB 内存
  • 采用单机部署模式(docker compose)

预设条件:

  • 每个客户端平均发送编辑事件频率约为 0.15 次每秒;
  • 当协同编辑人数达到 200 时,协同并发数约为 30(CS QPS=30);

测量方法:

  • 逐步增加协同编辑人数,观察并记录协同延迟情况;
  • 测量总时长为 5 分钟;

预期结果:研究协同编辑人数与协同延迟 (pct99) 之间的关系。

测量结果:

Number of Users 50 100 150 160 170 180 190 200 210 220 230 240 250
Latency pct99 (ms) 32 80.4 281.9 413.4 506 654.8 862.4 1352.8 2051.2 2706.7 3662.8 4674.6 5409.7

总结

  • 图表显示,在一台普通的 4 核 8GB 服务器上处理 200 个并发用户时,协同引擎协作延迟保持在约 1.3 秒左右;
  • 随着协同编辑人数变多,协同延迟逐渐出现非线性的增长,下面是对其指数拟合:y = 3.92e^(0.03x)

凭借这些基准结果,Univer 协同引擎在实时协作中展现出不俗的性能,处理 200 个并发用户时,协同引擎成功将协作延迟保持在约 1.3 秒左右,接近业界主流产品水平。

同时随着协同人数增加,协同延迟出现指数增长的趋势。我们将继续改进引擎支持大量并发用户的能力,并尽量降低延迟。

下一步

本实验重点关注协同引擎外部的观测数据,如协同延迟和协同人数,然而当协同人数逐渐增多时,协同延迟出现较大幅度增长。分析其原因,需要增加更多的内部视角:如,随着人数增加,与 transform, apply 的处理延迟之间的关系;

此外,随着人数增加,网络吞吐量将成为一个关键因素。我们需要研究编辑人数、网络吞吐量和延迟之间的关系。

再者,多文档数量与延迟之间的关系。本研究仅对单个文档进行实验。在涉及多个文档时,在保持较低延迟的情况下,单个 Node.js 能够承载多少文档呢?由于 Node.js 的单线程特性极大地限制了其并发能力,在处理多个文档时,效率也会有所降低。

通过持续优化和创新,我们有信心让 Univer 协同引擎在实时协作领域脱颖而出,为用户带来更加流畅体验。

相关推荐
gqkmiss7 分钟前
Chrome 浏览器 131 版本开发者工具(DevTools)更新内容
前端·chrome·浏览器·chrome devtools
Summer不秃13 分钟前
Flutter之使用mqtt进行连接和信息传输的使用案例
前端·flutter
旭日猎鹰17 分钟前
Flutter踩坑记录(二)-- GestureDetector+Expanded点击无效果
前端·javascript·flutter
Viktor_Ye23 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
hummhumm25 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
乐闻x1 小时前
Vue.js 性能优化指南:掌握 keep-alive 的使用技巧
前端·vue.js·性能优化
一条晒干的咸魚1 小时前
【Web前端】创建我的第一个 Web 表单
服务器·前端·javascript·json·对象·表单
Amd7941 小时前
Nuxt.js 应用中的 webpack:compiled 事件钩子
前端·webpack·开发·编译·nuxt.js·事件·钩子
生椰拿铁You1 小时前
09 —— Webpack搭建开发环境
前端·webpack·node.js
狸克先生1 小时前
如何用AI写小说(二):Gradio 超简单的网页前端交互
前端·人工智能·chatgpt·交互