网易云信大规模聊天室系统架构解析

前言

聊天室是一类很是重要的 IM 系统,不一样于单聊和群聊,聊天室是一种大规模的实时消息分发系统。算法

聊天室有多种技术实现方案,业界也有一些开源的实现,每种实现都有本身的特色和应用场景。网易云信做为 PaaS 平台,其聊天室的系统架构和方案有几个突出的特色:后端

  • 水平扩展能力:主要体如今两方面,一个是聊天室数量,一个是单个聊天室的人数。
  • 功能丰富:做为一个平台,聊天室提供底层通讯能力,提供了丰富的功能集,来适配各类各样的业务场景,使用方能够根据本身的业务要求按需使用。
  • 支持全球化:云信目前提供了覆盖全球的通讯网络,经过接入云信自研的 WE-CAN 大网,全球范围内延迟不超过 250ms。

本文咱们来详细介绍一下网易云信大规模聊天室系统的具体架构以及实践应用案例缓存

网易云信聊天室系统架构

首先,咱们先来看一下网易云信当前聊天室的详细技术架构,以及咱们在架构升级优化过程当中作的一些事情。安全

总体架构图

以下图,是网易云信聊天室的技术架构:性能优化

网易云信聊天室的技术架构

主要包括如下部分:服务器

  • 接入层的 ChatLink
  • 网络传输层的 WE-CAN、WE-CAN bridge
  • 调度层的 Dispatcher
  • 服务层的 Callback、Queue、Presence、Tag、History 等
  • CDN 分发层的 CDN Manager、CDN Pusher、CDN Source

下面,咱们针对每一层展开详细分析。微信

接入层

接入层

接入层根据客户端的类型不一样会有不一样的实现,例如常见客户端(iOS、Andriod、Windows、Mac 等)基于私有二进制协议,Web 端基于 Websocket 协议实现。接入层做为距离客户端的最后一千米,其接入速度、质量以及数据安全都是相当重要的:网络

接入速度和质量多线程

目前咱们搭建了覆盖全国各省份以及全世界各大洲的边缘节点,缩短最后一千米,减小不肯定性,提高服务的稳定性。架构

数据安全

基于对称+非对称加密,客户端与服务器以前实现 0-RTT,完成秘钥交换和登陆,同时也支持 RSA/AES/SM2/SM4 等各类加密算法。

接入层除了接受来自客户端的请求,还负责进行消息的单播和广播,所以接入层须要管理本节点的全部长链接,包括每一个聊天室房间的链接以及每一个链接的标签属性。此外接入层会上报本身的负载信息给后端服务,方便调度层进行合理的调度。

当流量洪峰来临时,由于须要进行消息的广播,接入层每每是压力最大的,为了保证服务的稳定性,咱们作了不少优化策略:

自适应的流控策略

  • 单机流控:接入层服务会监控本机总体的网络带宽使用状况,并设置 2 个阈值 T1 和 T2,当带宽使用率超过 T1 时,触发流控,若是进一步超过了 T2,则不只触发流控还会不断的调整流控的强度。最终的目标是使带宽使用率稳定在 T1 和 T2 之间。
  • 单链接流控:除此以外,接入层服务还会记录每一个长链接的消息分发速度,并进行细粒度的调整,避免单机粗粒度流控致使单个链接分发过少或者过多,作到消息分发的平滑,即减小了带宽流量的波动尖刺,也改善了端侧的体验。

性能优化

ChatLink 高负载运行时,除了网络带宽,调用链路上的各个环节均可能成为性能的瓶颈。咱们经过减小编解码的次数(包括序列化、压缩等)、多线程并发、减小内存拷贝、消息合并等多种方式,显著地提高了服务性能。

网络传输层

网易云信聊天室系统最初的架构是将接入层和后端服务层部署在同一个机房的,大部分用户都是直连 BGP 机房的 ChatLink,对于偏远地区或者海外,则经过专线的方式部署代理节点完成加速。该方案存在明显的缺点就是服务能力上限受制于单机房的容量,此外,专线也是一笔不小的开销。

在咱们接入 WE-CAN 大网后,接入层 ChatLink 能够作到客户端就近接入,提升服务质量的同时下降了成本。此外,多机房的架构也使得咱们的服务能力上升了一个台阶。

网络传输层

为了适配 WE-CAN 大网,咱们设计了 WE-CAN Bridge 层,做为大网接入协议和聊天室协议的桥接层,负责协议转换、会话管理、转发接收。经过这种分层架构,接入层和后端业务层能够少修改或者不修改,减小对已有系统的改形成本,也下降了架构升级带来的风险。

调度层

调度层是客户端接入聊天室系统的前提。客户端登陆聊天室以前须要先获取接入地址,分配服务咱们称之为 Dispatcher。

调度层

Dispatcher 是中心化的,会接受来自 WE-CAN 和 ChatLink 的心跳信息,根据心跳状况来选择最佳接入点,调度系统设计主要考虑的几个关键点是:

调度精度

调度系统会根据请求方的 IP 判断地域和运营商信息,对比各个边缘节点的所属区域、运营商以及节点自己的负载(如 CPU、网络带宽等),此外还考虑边缘节点到中心机房的链路状况(来自 WE-CAN),计算综合打分,并把最优的若干节点做为调度结果。

调度性能

面对高并发场景,好比一个大型聊天室,活动初期每每伴随着大量人员的同时进入,此时就须要调度系统作出快速的反应。为此,咱们会将上述的调度规则以及原始数据进行本地缓存优化,此外,为了不心跳信息滞后致使分配不合理引发节点过载,分配服务时还会动态调整负载因子,在保证调度性能的前提下,尽可能作到分配结果的平滑。

服务层

服务层实现了各类业务功能,包括:在线状态、房间管理、云端历史、第三回调、聊天室队列、聊天室标签等。其中最基础的是在线状态管理和房间管理:

  • 在线状态管理:管理某个帐号的登陆状态,包括登陆了哪些聊天室、登陆在了哪些接入点等
  • 房间管理:管理某个聊天室房间的状态,包括房间分布在哪些接入点,房间里有哪些成员等

在线状态管理和房间管理的难点在于如何有效管理海量用户和房间。网易云信 PaaS 平台的特性,使得咱们能够根据不一样的租户来进行 Region 划分,从而作到水平扩展。此外,因为状态数据有快速变化的特色(短 TTL),当某些核心用户或者某个客户报备了大型活动时,云信能够在短期内进行相关资源的快速拆分和隔离。

服务层除了要支持海量客户接入、水平扩展外,还有一个很重要能力,就是须要提供各类各样的扩展性功能来适配客户各类应用场景。为此云信提供了各类各样丰富的功能,好比:

  • 第三方回调:方便客户干预 C 端用户的登陆、发消息等核心环节,自定义实现各类业务逻辑。由于涉及到服务调用,而这个调用是跨机房甚至是跨地区的,为了不第三方服务故障致使云信服务异常,咱们设计了隔离、熔断等机制来减小对关键流程的影响;
  • 聊天室队列:能够方便用户实现一些诸如麦序、抢麦等业务场景需求;
  • 聊天室标签:做为云信业内独创的特点功能,支持消息的个性化分发。其实现原理是经过客户端登陆时设置标签组以及发消息时设置标签表达式,来定义消息分发和接收的规则。标签信息会同时保存在服务层以及接入层,经过将部分标签计算下推到接入层,节省了中心服务的带宽和计算资源。

CDN 分发层

当咱们评价一个聊天室系统时,经常使用的一个词是无上限。架构支持无上限不表明真的无上限。一个聊天室系统,在逻辑上,各个组成单元都是能够水平扩展的,可是每一个服务所依赖的物理机、交换机、机房带宽等都是有容量上限的。所以,可以合理地调配多个地域的多个机房,甚至是外部的其余资源,才能真正体现出一个聊天室系统所能支撑的容量上限。

在网易云信的聊天室系统中,用户全部的接入点遍及各地机房,自然的将各地的资源进行了整合,所能支撑的容量上限天然高于单机房或者单地区多机房的部署模式。

进一步的,当面临一个更大规模的聊天室,此时若是能利用一些外部的通用能力不失为一种合适的选择。融合 CDN 弹幕方案就是这样一种技术实现方案,它能够利用各大 CDN 厂商部署在各地的边缘节点,利用静态加速这样的通用能力来支持超大规模的聊天室消息分发。

基于融合 CDN 弹幕分发方案,其核心点就是弹幕的分发和管理,这是一个可选的模块,云信内部对此进行了封装,能够根据不一样的业务特色来选择是否开启而不须要修改任何业务代码。

在开启融合 CDN 弹幕分发方案的状况下,全部的弹幕广播会划分红 两条链路:

  • 重要的且须要实时送达的消息会走长链接到达客户端
  • 其余的海量消息则会进入 CDN Pusher,经过各类策略进行聚合后送达 CDN Source

客户端 SDK 会采起必定的策略定时从 CDN 边缘节点获取弹幕消息。SDK 会聚合不一样来源的消息,排序后回调给用户,App 层无需关系消息来自哪里,只需根据本身的业务需求进行处理便可。

CDN 分发层

如上图,展现了 CDN 弹幕分发链路的消息流转过程:CDN Manager 负责管理不一样 CDN 厂商的分配策略(登陆时会经过长链接下发,且能动态调整)。此外,还负责管理平台上各个聊天室融合 CDN 模式的开启和关闭,以及对应的 CDN Pusher 资源的调配和回收。CDN Pusher 实际负责接收来自客户端消息,并根据消息的类型、消息的优先级等,组装成以一个一个的静态资源,推给 CDN Source,等待 CDN 回源拉取。

落地实践案例

下面,咱们介绍应用了网易云信聊天室系统的典型应用场景。

大规模场景应用案例

在2020年8月,网易云音乐 TFBoys 的 7 周年线上演唱会就是一个聊天室大规模场景应用的典型案例。在这场活动创造了 78w+ 的在线付费演唱会的世界纪录,其弹幕互动的实现方式采用了网易云信基于融合 CDN 弹幕分发方案。事实上,在筹备环节,咱们的聊天室系统达成了 20 分钟完成从 0 到 1000w 在线,上行消息 tps 达到 100w 的性能指标。

大规模场景应用案例

如上图,是支持本次活动弹幕分发的架构图,普通弹幕和礼物消息分别经过客户端 SDK 以及服务器 API 到达云信服务器,并最终进入弹幕广播服务,随后分流到长链接和 CDN 上,再经过 pull / push 混合的方式送达客户端。

特点功能 - 聊天室标签应用案例

近年来,随着互联网的发展,在线教育愈来愈火爆,最近又兴起了“超级小班课”模式。所谓超级小班课,指的是大型多人课堂与小班互动模式结合。

在线直播场景下,文字互动做为其中重要的一环,是聊天室的典型应用场景。但在超级小班课的模式下,常规的聊天室系统却存在各类各样的问题,不论是创建多个聊天室,仍是单个聊天室进行消息过滤,都存在一些严重的问题。

网易云信独创的聊天室标签功能,完美支持了上述业务场景,基于聊天室标签,咱们能够灵活地支持聊天室消息定向收发、聊天室权限定向管理、聊天室成员定向查询等个性化功能,真正实现大型直播下多场景的分组互动,好比对学生进行分组标签后,方便进行因材施教;分小组讨论,小组间内部讨论和组间 PK 等等。

特点功能 - 聊天室标签应用案例

如上图,展现了超级小班课的一个场景:1 个主讲教师+ N 个互动小班+ N 个助教,全部学生被划分红了一个一个的小班,由对应的助教完成预习提醒、课后答疑、做业监督、学员学习状况反馈等工做,同时又接收来自主讲老师的直播画面,作到了大课的规模,小课的效果。

总结

以上,就是本文的所有分享,主要介绍了网易云信构建一个大型聊天室系统的主要技术以及架构原理。任何系统的搭建都不是一蹴而就的,云信也会继续打磨底层技术,就像引入 WE-CAN 来提高网络传输效果,也会继续丰富完善咱们的功能图谱,如业内独创的聊天室标签功能等。网易云信将持续在 IM 领域深耕,为各类场景和行业的用户提供最优质的服务。

做者介绍

曹佳俊,网易云信资深服务端开发工程师,中科院研究生毕业后加入网易,一直在网易云信负责 IM 服务器相关的开发工做。对 IM 系统构建以及相关中间件的开发有丰富的实战经验。

更多技术干货,欢迎关注【网易智企技术+】微信公众号