近两年,国内文档类 SaaS 产品层出不穷,协作云文档作为云时代办公的一种工具和方式。与传统的离线办公软件不同,协作云文档更加注重协作的沟通和效率,同时作为工具类产品也同样关注性能和体验。就在不久以前,《一个救命文档的 24 小时》刷屏朋友圈,在河南暴雨灾情中,腾讯文档快速响应灾区需要,提升稳定性,确保产品体验。
腾讯文档脱胎于 QQ 家族旗下一款团队协作 IM 软件 TIM 的在线文档模块,最初基于开源软件搭建的技术架构,随着业务的高速发展,已无法完全满足业务的需求,且积累下了比较沉重的技术债务。团队经过慎重的讨论,决定从底层开始,分模块,逐步重构整个技术体系。在技术迭代的过程中,团队也在不断探索和尝试业内一些先进成熟的技术解决方案。
腾讯文档整个技术体系内集成了许多微服务为腾讯文档提供业务支持,比如 图像识别、SSR、截图、文档预览 等,这些微服务需要从效率和成本需求出发考虑解决方案,以实现可扩展、易维护、降低开发成本的目标。伴随着公司自研上云的浪潮,在近来的开发中,团队在多个微服务项目中深入使用 腾讯云 Serverless 架构,满足了业务的需求,取得了不错的效果。
办公类产品是有明显的流量潮汐的,比如上午 8 点到 12 点,下午 2 点到 6 点这几个时段是流量比较大的时候,其他时间段尤其是凌晨没什么流量。随着用户量快速增加,这种潮汐规律尤为明显,高峰时期海量用户的实时修改对服务器造成巨大的压力。
传统架构下可以通过增加虚拟机,实现应用的可扩展。但由于预估容量不足,导致业务流量高峰期时,大量用户出现请求超时的情况,这意味着品牌声誉受损、用户流失。虽然可以通过创建虚拟机实例的方式进行扩容,但是仍然要做很多额外的配置。应用底层有很多依赖的框架或语言运行时需要安装,安装完成之后还需要配置和部署应用,这个周期至少需要 1-2 个小时,这种情况下传统的部署架构无法做到资源与流量的匹配。
腾讯文档借助 Serverless 云函数搭建文档页面直出服务,将文档的内容渲染能力实现为函数,部署在云函数环境上,当文档业务流量激增,由云函数的负载均衡系统自动分配执行环境,处理海量用户触发的内容更新请求负载,动态扩缩容能力为微服务提供最合理的资源分配。同时通过设置云函数预置并发,可预先启动多个函数实例,保持云函数的活性,消除冷启动,降低在运行环境初始化和业务代码初始化产生的耗时。
腾讯文档自推出以来,已达千万月活,为了支持用户打开页面时能快速看到页面内容,浏览器直接解析 HTML 直出的字符串模版显示页面,流量激增导致集群负载、前端渲染压力增加,首屏加载时间慢等问题。SSR 团队需要实现一套弹性高可用性的直出解析服务来处理文档和表格的页面内容,满足可扩展、易维护、降低开发成本 的目标。文档的渲染能力几乎都是前端同学在负责,而前端同学大多服务端知识积累比较浅,对于服务的开发运维经验比较少,长期的运维成本是新的架构设计重要的评估维度,从而让前端团队可以更加聚焦于业务逻辑本身。
SSR(Server-Side Rendering)需要依赖 Node.js 服务渲染页面,显然会比仅仅提供静态文件的 CSR(Client-Side Rendering)应用需要占用更多服务器 CPU 资源,借助 Serverless 方案,前端同学无需关注 SSR 服务器的部署、运维和扩容,通过云函数对底层服务进行封装,极大地减少部署运维成本,更加聚焦业务开发,提高开发效率。
全新 Serverless Web Funciton 服务开发模式,只需简单修改监听端口,即可将目前流行的 Node.js 框架直接部署上云,享受 Serverless 技术带来的免运维、低成本、按需扩缩容的众多优势,欢迎体验。
腾讯文档幻灯片支持编辑公式的能力,OCR 图像识别是腾讯文档幻灯片结合外部的 OCR 服务能力来完成文档内的公式图片转换为公式,进而方便用户进行公示编辑。问题点在于:**外部提供的 OCR 服务做了限制,不支持前端请求,仅支持服务端请求。**传统的解决方案需要后台同学接入,进而增加了人员排期、对接等项目管理的复杂度。
腾讯文档将外部提供的 OCR 用云函数 SCF 做一层转发,腾讯文档再对接联调云函数的接口。解决了外部服务的限制,同时节省了后台开发资源,前端业务开发同学可以自己快速对接上外部服务,大大提升了开发效率。
腾讯文档插件 1.0 的方案是基于对文档前端封装到前端插件 SDK 的方案,在内部插件业务严重耦合文档实现的前提下,无法将文档能力以安全、成体系的方式对外提供,持续去开放前端文档的编辑的能力,会使前端 SDK 和文档侧的实现逐步变得臃肿,最后有可能会在变成巨石应用上长期存在的技术债务。
插件 2.0 方案的核心是基于后台内容编辑的能力开放,利用文档的数据响应式的更新机制,**云函数便成为 前端 - 云函数 - 后台内容编辑 中关键环节,将开放的实现从前端剥离,通过云函数承载进行开放。**同时,不同服务的调用量级不同,云函数带有天然的服务隔离和动态修复能力,可针对不同服务相互隔离,分别进行升级拓展,避免服务间的影响。
在进行应用版本更新及切换时,为了保证线上整体系统业务稳定,及时发现业务代码的问题,研发团队会采取灰度发布的方式测试迭代。通过云函数针对特定的版本进行逐步的流量切换,可以实现某个版本的平滑灰度,保证新上线的版本能够 在可控的范围能进行发布迭代。
通过云函数版本隔离测试环境和生产环境,线上通过对 $LASTEST 进行版本的固化,可以把测试环境的 API 网关对接到 TEST 版本,将生产环境对接都固化的版本上,保证生产环境的代码质量安全。
本地开发测试后,触发 CI/CD 流程,就可以完成部署流程。同时,云函数提供了日志监控、灰度、发布回滚等能力,可以通过接口或者插件实现完全自动化的流程。云函数基于腾讯云专业的保障集群,自带负载均衡和弹性伸缩,开发同学基本不需要再关心运维等问题,可以有更多的时间聚焦业务的优化。服务端经验较少的前端开发工程师也可以较为轻易的开发维护服务。
云函数实现 1ms 计费粒度,按实际用量计费,帮忙用户获得显著的成本优势,在没有访问量时实现自动缩容,节约部署成本。
凭借腾讯云函数的多版本能力,可以灵活部署多个在线版本,通过和网关的配合的,轻松做到多版本共存,提供定制化的处理能力。
使用 Serverless 方案之后,极大减少了运维和监控的负担,开发同学可以把更多的精力放在方案的优化和技术迭代中,快速验证产品特性,推动团队技术业务的发展。
当下浏览器环境是有性能瓶颈的,对于较为复杂的异步逻辑可以考虑使用云函数将逻辑服务化,接下来,腾讯文档计划对前端浏览器逻辑 Fass 化,可以从前端分离到服务端,进而降低浏览器性能压力。
在协作办公的赛道上,团队业务还在快速的成长,**面对快速变化的技术迭代,低成本、快速开发、快速部署、快速上线的 Serverless 解决方案成为了团队在微服务技术选型中优先考虑的架构。**借助云函数 SCF 的能力,团队不用再担心后台计算资源的问题,可以更加有信心应对更多突如其来的事件。未来,随着腾讯文档开放平台的建设,会有更多的使用云函数 SCF 的微服务跑在腾讯文档的业务中,为广大用户提供更好的服务。