Rocket.Chat 为数百万人扩展开源实时消息系统

在本文中,演讲者基于 Rocket.Chat 这一开源的实时消息系统,介绍了其研发团队在解决用户数量增加而带来的应用服务扩展时的对策和具体做法。讲者对系统的两次扩展后服务架构的具体构成及所使用的库进行了详细的介绍,并通过测试结果表明扩展后系统的容纳能力和消耗资源均有较大的优化。

来源:FOSDEM 2023 | Real Time Communications devroom
主讲人:Floris van Geel
链接:https://fosdem.org/2023/schedule/event/scaling_rtc_messaging
内容整理:王秋文

实时开源的消息系统当其较小、只服务于几百个客户且媒体处理能力有限的时候,其设计和编程搭建工作都是较为简单的。而当一个开源的项目逐渐取得成功的时候,用户群体往往开始提出在最开始软件设计时没有预料到的扩展功能,进而使得整个项目可能随着其在大小和复杂度两个方面都越来越大的代码库而在软件升级的转变过程中获得不好的结果。

Rocket.Chat 作为一个开源的项目也在发展历史中经历了两次这样的转变。第一次的时候,项目的开发者将多容器化实例方法应用到单片架构的项目中。得到的结果既令人惊讶,又相当实用——可以很轻易地为成千上万的用户提供服务,满足了当时的需求。

该项目的持续成功使其第二次过渡到建设世界规模(接近数十万用户)的消息传递系统。这一转变需要对单片架构的服务(monolith server)进行一次完整的重构,这是项目团队在一定时间内就必须完成的工程任务。经过与研发团队长达两年的合作,其结果可以粗略地描述为基于可扩展功能后端的“微服务”(micro services)。

Rocket.Chat 介绍

图片
图1 Rocket.Chat 介绍

Rocket.Chat 是一个安全合规的协作平台。Rocket.Chat 能够将团队工作中的消息、项目和任务集中到一个地方,从而将团队的生产力提升到新的高度。基于 Rocket.Chat 可以实现用户自己的系统和集成平台。此外,Rocket.Chat 提供全渠道的客户服务,可以在全渠道上与客户进行交互,以确保用客户间的长期关系和业务成果的不断完善。另外,还可以通过集成和对Rocket.Chat 中的组件和企业功能进行白标签化,在使用者的应用程序或网站中创建自定义信息传递体验。最后,可以使用自定义应用程序、开放的API、强大的插件和 webhook 扩展并定制工作空间,从而将工具、人员和流程整合在一起。

Rocket.Chat 的扩展

图片
图2 第一次扩展后的服务架构

最初,Rocket.Chat 与许多其他的应用一样,基于单片结构(monolith),也就是基于一个服务器处理所有的事项。当大约有 1000 名用户使用 Rocket.Chat 时,开发团队通过增加 dockerized 实例,将多个单片结构组合起来,并基于 MongoDB 实现应用的第一次扩展。每一个实例都会处理所有的基于数据库的事件以对在扩展过程中增加 CPU 和存储空间消耗的实例进行过滤。从整体上看,通过不同实例间信息的交流以实现整个平台的扩展。

图片
图3 第二次扩展后的服务架构

当 Rocket.Chat 需要进一步扩展时,团队将基于单片(monolith)的架构转为了微服务(micro services)架构。在这一过程中,主要基于负载对服务器进行扩展,其中 Websocket (DDP Streamer) 是负载最重的部分。将基于数据库的事项在单个实例(Stream Hub)中进行处理,它可以将一些事项直接发送到 DDP Streamer 中从而实现程序的高可扩展性。此外,这一架构允许像 Apps Engine 一样将未来的代码进行拆分,将集成中可能导致性能表现上存在问题部分的代码与主代码区分开来。

图片
图4 Moleculer 介绍

为了更改架构,研发人员选择了一个新的库进行实现,名字叫做 Moleculer。它是一个渐进式的基于Node.js的微服务框架。使用这个库最重要的好处在于其可以支持 NATS/MQTT/AMQP/Kafka 等多种消息转运系统,而 Rocket.Chat 的研发人员选择了 NATS。此外,Moleculer 还有许多适配器缓存以及其他的强大功能可以用于添加。

图片
图5 Moleculer 性能比较

可以从图中看出,Moleculer 其实并没有其他库那么快。但 Moleculer 的主要优点在于你可以在它的远程和本地操作之间进行转换,也就是说你可以在一个代理中切换它们。Moleculer 的这种灵活性就是为什么选择它作为架构的主要驱动力的原因。

图片
图6 NATS 介绍

NATS 是一个开源的用于自适应边缘分布系统的连接技术,其基于 Go 语言,被很多大公司使用,且速度较快,但不支持队列。

图片
图7 开发具体经验介绍

在使用 Moleculer 和 Typescript 进行开发的过程中,研发团队也有一些具体的经验。研发团队使用 JavaScript 代理创建基于服务接口的虚假类。虚假类将方法调用转换为 Moleculer 服务调用。此外,允许导入没有依赖项的服务类,并提供可用方法以及参数的自动完成和类型检查。

图片
图8 扩展后的性能测试

对扩展前后的服务端进行测试,假定有 4k 个并发的用户,可以从图中的结果看出使用 8 个单片实例时,会占用 12GB 的 RAM 和 15 张 CPU。而更改为微服务架构后,使用每个服务的一个实例进行服务则仅仅占用 5GB 的 RAM 和 3 张 CPU。实际上,使用微服务后,可以同时处理超过 50k 的用户需求。

图片
图9 Rocket.Chat 官方渠道

想要了解更多与 Rocket.Chat 有关的信息,可以通过其官方渠道 open.rocket.chat 进行获取。

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(1)

发表回复

登录后才能评论