IM即时通信学习总结(1):IM系统是什么?

2019年11月14日


互联网从业者,编程语言,计算机网络,数据库存储是绕不开的三大主题,而IM系统,落地表现为每家企业开发的消息模块,是多种技术和领域知识的横向应用综合体。

下面是我从各网站阅读5星好文,采集来的知识点,用于总结对IM系统的学习和掌握。希望对各位理解IM系统能够有所帮助。

目录

IM系统是什么?

如何设计一个稳定的IM系统?

设计一个IM系统需要掌握哪些知识?

深入理解TCP传输协议

深入理解UDP传输协议

有关高性能网络编程的知识

深入理解移动互联网络的特性

深入学习通信技术物理层(高阶知识,选读!)

IM到底该用UDP还是TCP协议?


IM系统是什么?

IM全称是『Instant Messaging』,中文名是即时通讯。在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉、微信、QQ等以IM为核心功能的产品。当然目前微信已经成长为一个生态型产品,但其核心功能还是IM。还有一些非以IM系统为核心的应用,最典型的如一些在线游戏、社交应用,IM也是其重要的功能模块。可以说,IM系统已经是任何一个带有社交属性的应用需要具备的基础功能,网络上对于这类系统的设计与实现的讨论也越来越多。
 

如何设计一个稳定的IM系统?

IM系统在互联网初期即存在,其基础技术架构在这十几年的发展中更新迭代多次,从早期的CS、P2P架构,到现在后台已经演变为一个复杂的分布式系统,涉及移动端、网络通信、协议、安全、存储和搜索等技术的方方面面。IM系统中最核心的部分是消息系统,消息系统中最核心的功能是消息的同步、存储和检索:

  • 消息的同步:将消息完整的、快速的从发送方传递到接收方,就是消息的同步。消息同步系统最重要的衡量指标就是消息传递的实时性、完整性以及能支撑的消息规模。从功能上来说,一般至少要支持在线和离线推送,高级的IM系统还支持『多端同步』。
  • 消息的存储:消息存储即消息的持久化保存,传统消息系统通常只能支持消息在接收端的本地存储,数据基本不具备可靠性。现代消息系统能支持消息在服务端的在线存储,功能上对应的就是『消息漫游』,消息漫游的好处是可以实现账号在任意端登陆查看所有历史消息。
  • 消息的检索:消息一般是文本,所以支持全文检索也是必备的能力之一。传统消息系统通常来说也是只能支持消息的本地检索,基于本地存储的消息数据来构建。而现在消息系统在能支持消息的在线存储后,也具备了消息的『在线检索』能力。

preview

 

如图是一个典型的消息系统架构,架构中包含几个重要组件:

  • :作为消息的发送和接收端,通过连接消息服务器来发送和接收消息。
  • 消息服务器:一组无状态的服务器,可水平扩展,处理消息的发送和接收请求,连接后端消息系统。
  • 消息队列:新写入消息的缓冲队列,消息系统的前置消息存储,用于削峰填谷以及异步消费。
  • 消息处理:一组无状态的消费处理服务器,用于异步消费消息队列中的消息数据,处理消息的持久化和写扩散同步。
  • 消息存储和索引库:持久化存储消息,每个会话对应一个Timeline进行消息存储,存储的消息建立索引来实现消息检索。
  • 消息同步库:写扩散形式同步消息,每个用户的收件箱对应一个Timeline,同步库内消息不需要永久保存,通常对消息设定一个生命周期。
    新消息会由端发出,通常消息体中会携带消息ID(用于去重)、逻辑时间戳(用于排序)、消息类型(控制消息、图片消息或者文本消息等)、消息体等内容。消息会先写入消息队列,作为底层存储的一个临时缓冲区。消息队列中的消息会由消息处理服务器消费,可以允许乱序消费。消息处理服务器对消息先存储后同步,先写入发件箱Timeline(存储库),后写扩散至各个接收端的收件箱(同步库)。消息数据写入存储库后,会被近实时的构建索引,索引包括文本消息的全文索引以及多字段索引(发送方、消息类型等)。

对于在线的设备,可以由消息服务器主动推送至在线设备端。对于离线设备,登录后会主动向服务端同步消息。每个设备会在本地保留有最新一条消息的顺序ID,向服务端同步该顺序ID后的所有消息。

 

设计一个IM系统伴随的风险?

我们都知道,IM系统的业务本质就是客户端与客户端进行消息的实时传递,而技术基础就是基于Socket连接的实时数据读写,那么基本的网络编程理论基础是作为新手的你必须掌握的知识点。当然,作为IM开发来说,基础的网络理论就够用了,也没有必要像网络工程师一样精通所谓的OSI七层参考模型。

深入理解TCP传输协议

透彻理解TCP传输协议的连接和断开过程非常有助于您日后IM算法的优化和实现,这个过程被形象的总结为“3次握手与4次挥手”。

深入理解UDP传输协议

相比TCP协议,UDP数据传输协议就显得非常轻量和易于理解,UDP通常被用于需要快速响应的数据传输场景下,对应于IM中的应用形态有:P2P通信、实时音视频等。另外,通常的IM都会被应用于互联网上(而非局域网),那么了解所谓的NAT路由技术原理等,也将有助于您对P2P打洞、UDP端口老化等概念有一个清楚的认知。

有关高性能网络编程的知识

未来您所编写的网络应用程序或产品基本都要运行基于广域网的互联网中(而非单纯而简单的局域网),而广域网因物理网络的复杂性,要编写能适应各种网络拓扑的程序代码,需要过硬的广域网络基础知识,比如NAT路由转发、P2P打洞等等。

实际上,大用户量高并发生产环境下的网络编程,你所开发的产品要想真正堪用并非易事,你很有必要了解高性能网络编程领域所关注的热点问题和努力的方向。

深入理解移动互联网络的特性

移动互联网络因为无线通信的复杂性:慢、高延迟、易受干扰、带宽窄等特点,使得与传统的有线网络下的应用功能实现有明显差异,您很有必要详细了解一下无线网络方面的特性。

深入学习通信技术物理层(高阶知识,选读!)

如果学完上述各小节里推荐的网络通信应用层知识,还觉得意犹未尽,那么你肯定是万中无一的人才了——是时候开始《IM开发者的零基础通信技术入门》这个高阶知识系列的学习了。

IM到底该用UDP还是TCP协议?

好了,上面的网络编程基础掌握后,就要开始为你的IM进行传输协议选型了。说到IM该用UDP还是TCP作为传输协议,这是个颇有争议的话题,各大社区每当此问题的出现必定是大片的不同声音。

当然,UDP和TCP各有各的应用场景,作为IM来说,早期的IM因为服务端资源(服务器硬件、网络带宽等)比较昂贵且没有更好的办法来分担性能负载,所以很多时候会考虑使用UDP,这其中主要是早期的QQ为代表。

时至今日,TCP的服务端负载已经有了很好的解决方案,加之服务器资源成本的下降,目前很多IM、消息推送解决方案也都在使用TCP作为传输层协议。不过,UDP也并未排除在IM、消息推送的解决方案之外,比如:弱网络通信(包括跨国的高延迟网络环境)、物联网通信、IM中的实时音视频通信等等场景下,UDP依然是首选项。

因为笔者在公司中是从事IM系统的开发,专栏还会不断更新,所以希望有相似经历的同学不吝赐教。

 

IM技术推荐网站及参考好文:

http://www.52im.net

https://zhuanlan.zhihu.com/p/62586632

http://www.52im.net/thread-464-1-1.html

https://yq.aliyun.com/articles/698301?utm_content=g_1000052301


欢迎扫二维码关注公众号,获取技术干货

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值