首页 存档 技术 查看内容

一套简洁的即时通信(IM)系统

2018-3-30 13:00 |来自: 互联网 461 0

摘要: 本文选自《开发者头条》3 月 9 日最受欢迎文章 Top 3,作者 扒粪者-于雨氏 ,感谢 @干货 分享。 欢迎分享:http://toutiao.io/contribute 无论是IM消息通信系统还是客户消息系统,其本质都是一套消息发送与投递系 ...

本文选自《开发者头条》3 月 9 日最受欢迎文章 Top 3,作者 扒粪者-于雨氏 ,感谢 @干货 分享。

欢迎分享http://toutiao.io/contribute


无论是IM消息通信系统还是客户消息系统,其本质都是一套消息发送与投递系统,或者说是一套网络通信系统,其本质两个词:存储与转发。由于看到最近一个月内业界有些公司的相关人员介绍了自己的IM系统:

  • 1 如携程高级经理顾庆分享[参考文档1]的携程异步消息系统初期架构:

  • 上面两幅图[图片来自参考文档1]所示显示了携程家的消息系统的初期架构,图片1中的架构充分体现我朝IT开发人员"快糙猛"的开发风格,直接用mongodb作为消息队列,然后就把系统开发出来了,至图片2中才稍微见到一个常见IT系统的接口层。

  • 2 京东咚咚初期架构

  • 上面这幅图[参考文档2]揭示了京东家的消息系统的初期架构,作者云下山巅[mindwind]揭示了其特点是“为了业务的快速上线,1.0 版本的技术架构实现是非常直接且简单粗暴的”,而且后台系统使用.net基于Redis就把一个IM系统开发出来了。

  • 两家系统的初期架构说明,一套消息系统对提升自家的服务质量是多么的重要,可以认为现代的服务型的互联网公司成长过程就是一套IM系统的进化史。

    也说明,一家的稍微初具实力的IT公司都可以自己很easy地搭建一套简单易用的即时通信系统。

    本文结合鄙人对IM系统的了解,也给出一套初具IM系统系统特点的消息系统模型。

    2 在线消息系统

    本文只考虑IM系统的在线消息模型,不考虑其离线消息系统[能够存储IM消息的系统]。根据个人理解,其应有的feature如下:

    • A 整个系统中Server端提供存储转发能力,无论整体架构是B/S还是C/S;

    • B 消息发送者能够成功发送消息给后端,且得到后端地确认;

    • C 接收端能否不重不漏地接收Server端转发来的没有超过消息生命周期系统承载能力的消息;

    • D 整个系统只考虑文本短消息[即限制其长度];

    • E 每条消息都有生命周期,如一天,且有长度限制如1440B【尽量不要超过一个物理frame】,只考虑在线消息的处理,无论是超时的消息还是超出系统承载能力的消息[如键盘狂人或者键盘狂机器人发出的消息]都被认为是"垃圾消息";

    • F 为简单起见,不给消息很多类型,如个人对个人消息,群消息,讨论组消息等,都认为是一种群[下文用channel替代之,也有人用Room这个词]消息类型;

    • G 为简单起见,这个群的建立与销毁流程本文不述及,也即消息流程开始的时候各个消息群都已经组建完毕,且流程中没有成员的增减;

    • H 账户申请、用户鉴权和天朝独有的黄反词检查等IM安全层等暂不考虑;


    根据以上系统特点,先给出一套稍微完备的IM系统的框架图:

    针对上图,我先给出各个模块的中文说明,然后分章节介绍这套系统的各个模块的职能,以及相关的系统流程。


    系统名词解释:

    1 PC: 单机型客户端,如windows端和mac端等等;

    2 Web/h5: 网页客户端;

    3 Android: 手机移动端,取其典型Android端,当然也有ios端[但是考虑到各家开发App都是安卓客户端最先上系统新版本,故用Android代表之];

    4 broker:文本消息的有线或者无线接口端,考虑到携程采用了这个词,我也姑且先用之,它提供了消息的接收与投递功能;

    5 Relay:图片/语音/视频 转发接口端,其后端可以是自家的服务也可以是第三方服务(如提供图片存储服务的七牛、提供云视频解决方案的腾讯云等);

    6 msg chat server:消息逻辑处理端;

    7 Router: 在线状态服务端,存储在线的用户以及其登录的broker接口机;

    8 Counter: 消息计数器,为每个text等类型的消息分配MSG id;

    9 Msg Queue: 未读消息的msg id队列,存储每个client未接收的且未超时的且未超出队列大小的msg id集合;

    10 Mysql/mongodb: 消息存储服务、用户资料数据、以及channel成员列表服务数据库,因为二者比较典型,所以取用了这个名字,当然你可以在其上部署一层cache服务;

    11 Client:客户端层;

    12 Interface/If(下文简称If):服务接口层;

    13 Logic:消息逻辑处理层,[这层其实应该有系统最多的模块];

    14 DB:存储层,存储了在线状态、消息id以及msg id队列和消息内容等;

    15 http: 消息发送和接收协议,IM协议中一般理解为long polling消息处理方式,在web端多采用这种协议;

    16 Websocket: 另一种消息发送和接收协议,在移动环境或者采用html5开发的系统多采用这种协议;

    17 TCP: 另一种消息发送和接收协议,在环境或者采用html5开发的系统多采用这种协议;

    18 UDP: 另一种消息发送和接收协议,某个不保证提供稳定消息传输服务的厂家采用的协议,也许也是用户最多使用的协议,它的优点是无论是无线还是有限环境下都非常快,又由于http/Websocket的基础都是tcp协议,UDP协议在环境拥塞情况下由于不提供拥塞控制等退让算法,反而会去争用网络通道,所以在网络复杂的特别是发生网络风暴的情况下它会显得更快^ _ ^

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部