Microsoft Office实时协作服务的.NET迁移
去年,Microsoft将Office应用套件中的实时协作服务(Real-Time Channel, RTC)从.NET Framework 4.7.2迁移到了.NET 7。此次迁移带来了显著的性能提升:CPU使用率降低了30%,内存占用减少了60%,API延迟降低了50%。
服务概述
RTC服务支撑了Office文档的实时编辑与协作功能,无论是在桌面端还是Web端的Office客户端中。该服务每天处理数亿个文档会话,基于SignalR WebSocket库构建,并增加了会话管理、通知和路由功能。尽管该功能在社交媒体上常被抱怨无法正常工作,但其重要性不言而喻。
迁移背景
2021年4月,Microsoft决定将RTC服务从.NET Framework迁移到现代.NET(最初是.NET 5)。此次迁移的主要动机包括提升性能、可靠性、降低成本、现代化平台和代码库,以减少技术债务并提高工程团队的满意度。
迁移策略
工程团队放弃了完全重写服务的方案,因为这需要更改所有客户端库(包括所有Office客户端和Web应用),超出了Office协作服务团队的维护范围。取而代之的是,他们通过使用编译器条件指令修改服务代码,使其能够针对现代.NET Core进行编译。
主要挑战
迁移过程中,团队面临两个主要问题:
- RTC服务使用了已弃用的ASP.NET功能,如HTTP模块和处理器。
- SignalR服务器库的.NET Core和.NET Framework版本使用了不兼容的消息协议。
为了解决这些问题,团队编写了一个自定义的ASP.NET Core中间件,该中间件监听旧协议HTTP调用,并将其转换为SignalR Core版本所需的格式。这使得所有旧版客户端仍能使用旧版库,同时减轻了团队的维护负担。
迁移后的优化
迁移后,团队发现IIS服务器和SignalR Core库存在一些扩展性问题,并通过覆盖默认行为进行了修复。团队还使用事件计数器(跨平台的Windows性能计数器)来监控部署后的性能问题。在服务成功迁移到.NET 6后,团队进一步迁移到.NET 7,以利用垃圾回收器的性能改进,这需要对WebSocket连接管理进行一些重构。
未来规划
未来的改进路线图包括:
- 将服务迁移到.NET 8。
- 从IIS迁移到轻量级服务器Kestrel。
- 迁移Office客户端以使用ASP.NET Core SignalR通信协议。
- 移除服务中的自定义翻译中间件。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。