因为视频直播业务的大规模扩张,聊天室这种功能在最近几年又火了起来。本篇文章将会重点挑选聊天室这个典型场景,和大家分享一下网易云信在实现这个功能时是如何做架构设计的。

相关推荐阅读
几十万人同时在线的直播间聊天,如何设计服务端架构?

高并发IM系统架构优化实践

常见的虚拟社群

聊天室的应用场景非常广,除了传统的图文聊天外,时下流行的视频弹幕、在线秀场、在线教育、游戏互动等各式各样产品中都有类似的应用场景。

在讨论聊天室之前,我们先了解下几种常见的虚拟社群形态。下表从参与人数、消息送达即时性、离线消息关注度等维度对论坛、IM P2P、IM群和聊天室这几种常见的虚拟社群形态做了简单对比,从这个对比可以看到聊天室是不同于论坛和群模式的一种虚拟组织,聊天室的架构需要跳出传统思维来设计。

聊天室跟普通的IM群(微信群,QQ群等)相比最大的不同点在于它是一个比较开放的虚拟组织。我们可以将聊天室比喻成一个广场,广场是开放无边界的,所有的人都可以随进随出,而群就像一个房间,是一个有边界有容量上限的私密组织,并且进入这个房间需要一定条件,一般是主动申请加入或被邀请加入。聊天室对比BBS论坛这种虚拟组织来说,它既具有了IM群消息即时送达的特性又有论坛参与人数无上限的特性。

聊天室关键技术和难点

那么,是否能从一个已有的成熟技术框架上改造一个聊天室出来呢?

经过前面的比较我们看到,聊天室和论坛及IM群都具有一定的共性,看起来似乎可以将论坛架构改造成聊天室,也可以将IM群改造成聊天室。

路径一:将论坛架构改造成聊天室,首先需要提高消息送达的即时性,由于论坛都是基于HTTP协议的,为了保证消息即时送达,需要客户端不断轮询服务器来获取新的消息,如果对即时性的要求越高,那轮询的时间就需要缩短,这种模式在用户量达到一定规模后是无法承载的。为了保证消息的高效送达,客户端与服务器之间的需要采用长连接机制,新消息的送达通过服务器主动向客户端下推来完成。

路径二:将已有的IM群改造成聊天室,由于群具有对离线消息关注度高的特性,所有的群消息在成员离线时需要持久化,因而群人数越多效率越低,也正是因为这个原因,一般的IM群都是有人数上限的,如果想把群改造成聊天室,就不能存离线消息,所以这种方式看起来也不是这么顺畅。

现在市场上很多提供聊天室类服务的产品其实都是基于群的模式来实现的,所以人数上限一直是一个难以突破的瓶颈,甚至有的服务直接使用“超大群”或“千人群”这样一种特殊群模式来满足用户对聊天室场景的需求。

下面我们来看下,如果要实现一个人数无上限的聊天室服务,需要解决哪些难题。

首先:客户端多样性。近几年来移动互联网发展得非常快,现在推出的APP一般都需要同时具备iOS版、安卓版和Web版、PC版等不同的版本,跨平台的开发需求一直是拦在创业团队面前的一座大山;

第二:数据安全保障。当前的网络环境异常复杂,我们的APP在客户端与服务器之间的数据通信都暴露在复杂的公网环境中,消息经过哪些节点,中间有没有被抓包,数据是否被恶意采集,这些问题普通用户开和发者都容易忽略。如果数据通信过程中忽视了安全需求,很容易造成用户数据的泄露,数据的安全保障对于产品而言也很重要;

第三:需要应对网络故障或服务单点故障的难题。开发者代码写得再好也无法避免硬件故障或是网络故障这种不可预知的问题,在产品积累了一定的用户量之后,如果遇到服务可用性问题会造成用户流失;

第四:架构需要具备足够的弹性。在用户量级上来之后能支持快速的水平扩展,不会因为架构的问题需要重构;

最后:消息投递慢。聊天室对消息的即时性要求非常高,同一条消息在投递给不同成员时需要在毫秒级的延时完成,如果消息投递慢了会造成消息时间线错乱,聊天室里的人无法理解上下文场景。

基于这些难点,我们提出聊天室需要具备这些指标:跨平台、数据加密、高可用、易扩展、高并发低延迟。

网易云信聊天室的架构

上图是网易云信的聊天室分层架构。

客户端层:处理各种设备的兼容问题,包括对ios,Android,Windows, Web等各种开发平台的语言适配;消息通道的管理维护,包括移动设备上的弱网络管理,断线重连等;保证数据安全,所有上行下行的数据包都需要加解密处理,规避数据泄露或中间人攻击等各种安全风险。

网关接入层:管理大量客户端连接,单个节点可以维护的客户端数量在数十万量级;处理不同类型客户端的协议兼容,由于客户端实现技术的多样性,导致客户端与网关之间底层的数据通信协议存在差异,需要由不同的接入网关做协议转换;处理数据安全逻辑;跨网络的高可用逻辑,网络级别的主备(谁知道哪天网线会被蓝翔的毕业生挖断呢?);广播消息的高效下行分发,将收到的广播消息分发到所有连接在本节点上的客户端。

路由层:作为业务层接入的中转,同时承担负载均衡和高可用的作用,单个业务节点处理能力达到瓶颈时更方便的扩容,路由层使业务层扩容对前置网关层完全透明;当一个网络的业务集群出现网络故障时,可以切换到备用网络,保证服务可用性。

业务层:处理聊天室内的业务消息,一个集群内有众多节点,节点角色相互对等,任何一个节点的故障会使整个集群的处理能力下降,但不会引起服务的中断,因为其他节点可以继续接管业务数据包的处理;业务集群同样有多个网络环境的热备,以应对可能出现的区域性网络故障。

看完文章还是不知道怎么做?那么可以尝试借用目前已有的平台或工具,现在应用需要关注的是怎么以最快的速度抓住用户。网易云信是一个面对开发者的很好的IM云平台。十余年的研发积累,使其在即时通讯技术方面处于全国领先水平。网易云信至今已申请了60余项IM专利,远超市场同类产品。欢迎大家与我们讨论IM技术,也欢迎大家多多关注网易云信。

另外,想要获取更多产品干货、技术干货,记得关注网易云信博客哦~

IM即时通讯:如何跳出传统思维来设计聊天室架构?的更多相关文章

  1. 对接融云即时通讯组件SDK,轻松实现App聊天室

    我好像特别喜欢做聊天室类的东东,刚折腾完微软的SignalR又折腾App.本来想研究研究XMPP的,由于服务器的搭建问题,先采用一个第三方的吧,看看效果如何.听到弟弟说他们公司用到了融云,我也下载个S ...

  2. web即时通讯2--基于Spring websocket达到web聊天室

    如本文所用,Spring4和websocket要构建web聊天室,根据框架SpringMVC+Spring+Hibernate的Maven项目,后台使用spring websocket进行消息转发和聊 ...

  3. html5的新通讯技术socket.io,实现一个聊天室

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 【即时通讯】即时通讯及XMPP概述及…

    在讲解XMPP前,我们需要先了解什么是即时通讯技术: * 即时通讯技术(IM - InstantMessaging)支持用户在线实时交谈.当一方需要发送消息时,用户必须打开一个窗口,以便让用户与交流对 ...

  5. 从零开始开发IM(即时通讯)服务端

    好消息:IM1.0.0版本已经上线啦,支持特性: 私聊发送文本/文件 已发送/已送达/已读回执 支持使用ldap登录 支持接入外部的登录认证系统 提供客户端jar包,方便客户端开发 github链接: ...

  6. 【原创】轻量级移动设备即时通讯技术MobileIMSDK的常见问题解答

    申明:MobileIMSDK 目前为个人原创开源工程且已发布,现整理了一些有关MobileIMSDK的常见的问题,希望对需要的人有用,谢谢.如需与作者交流,见文章底部个人签名处,互相学习. Mobil ...

  7. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

    1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...

  8. 新手入门:史上最全Web端即时通讯技术原理详解

    前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...

  9. Web端即时通讯技术原理详解

    前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...

随机推荐

  1. Windows下静态编译Qt4

    既然是静态编译,那就要编译出来的程序不信赖于任何dll文件.首先下载qt-win-opensource-4.7.4-mingw.exe: http://get.qt.nokia.com/qt/sour ...

  2. C#中的MessageBox消息对话框

    关键字:C# MessageBox 消息对话框 在程序中,我们经常使用消息对话框给用户一定的信息提示,如在操作过程中遇到错误或程序异常,经常会使用这种方式给用于以提示.在C#中,MessageBox消 ...

  3. Ubuntu 14.04 64位字体美化(使用黑文泉驿)

    Ubuntu 14.04安装和升级后,,斜体字体变得很难看,昨天,我得到一个晚上,最终,管理一个线索,这里整洁. 在线调研后,.一致的观点是,,使用开源字体库文泉驿理想的黑色字体效果,效果甚至没有丢失 ...

  4. Why aren't more desktop apps written with Qt?(quora.com系列文章)

    As far as I know and have understood in my experience with Qt, it's a very good and easy to learn li ...

  5. 搭建本地yum源和局域网yum源

    搭建本地yum源和局域网yum源 由于很多客户环境是专网,不允许连网,无法使用网上的各种yum源,来回拷贝rpm包安装麻烦,还得解决依赖问题.所以想着搭建个本地/局域网YUM源,方便安装软件. 1   ...

  6. WPF编游戏系列 之七 动画效果(2)

    原文:WPF编游戏系列 之七 动画效果(2)        上一篇已经对关闭窗口图标进行了动画效果处理,本篇将对窗口界面的显示和关闭效果进行处理.由于所有的动画效果都是针对窗口界面的Canvas,所以 ...

  7. 在IOS开发中使用GoogleMaps SDK

    一.申请一个免费的API KEY要使用GoogleMaps SDK,必须要为你的应用申请一个API KEY,API Key可以让你监视你的应用调用api的情况.api key是免费的,你可以在任何调用 ...

  8. WPF 动态模拟CPU 使用率曲线图

    原文:WPF 动态模拟CPU 使用率曲线图      在工作中经常会遇到需要将一组数据绘制成曲线图的情况,最简单的方法是将数据导入Excel,然后使用绘图功能手动生成曲线图.但是如果基础数据频繁更改, ...

  9. WPF中的资源简介、DynamicResource与StaticResource的区别

    原文:WPF中的资源简介.DynamicResource与StaticResource的区别 什么叫WPF的资源(Resource)?资源是保存在可执行文件中的一种不可执行数据.在WPF的资源中,几乎 ...

  10. 高手问答精选:Go 语言 —— 云计算时代的 C 语言(类似于一个FAQ)

    Go 语言被称为云计算时代的 C 语言,它在软件开发效率和运行效率之间做出了绝佳的权衡.这使得它既适应于互联网应用的极速开发,又能在高并发.高性能的开发场景中如鱼得水.正因如此,许多互联网公司,尤其是 ...