连接层管理优化
消息快速到达的前提是客户端和服务器之间保持了稳定的快速的连接,所以连接层可以理解为奠定云信服务稳定性的基石。网易云信采取三大优化措施,全面助力连接层的提速和并发提升:
优化一:通过边缘节点优化网络拓扑
区域性网络问题是任何一个应用或者服务都会面临的问题,特别是对IM这类对于网络质量特别敏感的服务。网易云信通过部署区域性的边缘加速节点的方式来优化网络拓扑,提升网络质量。网易云信目前在海外,像美国,欧洲,中东和东南亚等很多国家和地区提供了这类边缘加速节点,加速节点和数据中心之间再通过专线等优质网络做互通,将整个用户链路中的关键路径替换成IDC之间的专线,大幅提升连接的稳定性和速度。通过优化,客户端到IDC中心的速度从之前的500+ms锐减至200ms,实现提速60%。同时,消息丢失率也从之前的20%+降低到0%。
优化二:场景化的消息分发机制提升吞吐率
点对点的消息分发模式非常依赖用户的在线状态。在消息分发过程中,一次在线状态的查询假定需要10ms,如果有100人发送消息,仅查询在线状态的开销就要1秒钟,并且这个时间开销还会随着消息接收人数的增加而成倍增加,再加上中间消息包的网络分发开销,这个消息处理的时间很快就会到达瓶颈。在聊天室场景下,这个问题就尤为突出。网易云信针对这种特殊的消息分发场景实现了一种消息分发的广播模式。假定一个100万人的聊天室,所有用户分布在10个连接节点上,一条广播消息在分发过程中只需要查询一次在线状态,并给每个Link分发一个广播包,到最终用户端的消息包由Link节点做内存拆包和下发,并且不同的节点之间可以完全并行处理。这种方式的消息分发使一个百万量级的消息分发任务可以在秒级处理时间之内完成,对消息接收者来说也能有效控制消息到达的延时情况。
优化三:集群化解决单节点性能瓶颈
通过组建集群来对业务处理能力做水平扩展是云信常用的一种方法。云信最初在设计针对Web浏览器的长连接服务器时,由于服务器既需要处理SSL编解码,请求包的格式转换,又要做长连接的管理,这直接导致了服务器性能很快达到瓶颈。特别是在用户侧的连接有比较频繁的重建的场景下,大部分的CPU资源都花在了SSL握手过程中。
连接建立之后,最终要的事情就是要开始做消息的分发投递了。为了应对聊天室这类特殊的消息场景,云信将消息的投递分拆到了两层上,并将大头计算量往前移到了连接服务器上;前置的连接服务器的压力会变大;针对这种情况引起的单个节点性能瓶颈,通过集群化和分离功能的方式来提升系统性能。
IM服务化和高可用
任何一个软件系统对数据库,存储平台和缓存平台等基础资源的依赖都非常强,这类基础平台资源的服务质量和强大的扩展能力会直接影响到整体系统的稳定性。云信集成了网易自研的分布式数据库,分布式缓存和对象存储服务等基础平台,使云信在面对业务扩容需求时更加从容。此外,云信还集成了如反垃圾云,视频云等面向具体业务的云服务,更加专业的团队来为云信的基础功能保驾护航。谈到网易云信作为即时通讯云平台的高可用性话题,核心功能保证99.99%的可靠性,一年不可用时长要小于52分钟,周梁伟解释要想要做到如此,必须做到以下两个方面:“第一、开发团队需要极高的运维意识,在开发设计时就注重应用的可用性和扩展性。第二,运维团队了解开发,通过专业的运维能力帮助开发规避风险。运维和开发相互合作,打造了云信的稳定。同时,容灾也是必不可少的。“
周梁伟讲解了云信的架构模式及逻辑关系:
网关接入层,负责客户端长连接的维护和管理,所有的接入节点甚至可以是无状态的对等节点,只负责客户端与服务器之间请求的传递的转发,并优化转发效率;网关接入层在实际部署时会同时分布到不同的网络环境中,比如分布在异地的两个机房中。
业务层,需要处理大量请求并负责和DB、缓存、队列,第三方接口等组件的交互,其稳定性,可用性和扩展能力直接影响了整个云服务的质量。为了使业务层具有更好的弹性,云信在网关接入层和业务层之间引入了一个路由层来解耦。业务节点在上线之后会将自己注册到服务中心,路由节点会转接网关层的请求包,并从服务节点中挑选匹配的节点分发请求,这种三层架构使系统整体具有更好的弹性。为了提高业务的可用性,云信会将业务节点分布到分属于不同网络的环境中,一旦其中一个环境的网络或者基础设施出现故障,云信可以快速得通过路由层来将故障集群下线。