IM开发快速入门(一):什么是IM系统?

本文在编写时参考了博客做者“鹿呦呦”和在线课程“即时消息技术剖析与实战”的相关资料,一并表示感谢。html

一、系列文章引言

IM系统看似简单(没错,不少土老板认为开发个qq和微信也就是几万块钱的事... ),实责是众多技术的应用合体,包括网络编程、移动开发、后端开发、高并发、高可用、高安全等技术范畴,再加上多端使用不一样的编程语言,想要凑齐一个典型的IM产品技术栈那也不是个容易事。编程

而对于IM开发入门者来讲,想要在众多的IM技术术语和概念中找到学习的方向和须要的资料,那也是件很让人抓狂的事。若是看到不应看的技术深水区文章,直接从入门到放弃——被活活吓退,那也是至关悲剧的。后端

本系列文章将尽可能从理论概念入手,通俗易懂的梳理IM中的基础技术概念和热门技术点,但愿能帮你理清看似一团乱麻的IM知识体系,助你找到清晰的IM技术学习方向,来日工资翻倍、迎娶白富美也未必不可能!缓存

二、本文内容概述

本文将带你快速了解一个主流IM系统的应用场景、典型架构、技术特色和功能组成,帮你快速创建对IM系统的主观认知。安全

若是你不想从技术的角度理解IM原理,能够尝试阅读此文:《知识科普:IM聊天应用是如何将消息发送给对方的?(非技术篇)》。微信

本文已同步发布于“即时通信技术圈”公众号。网络

三、IM的应用场景

IM其实并不局限于聊天、社交这类“典型”应用中,实际上它已经普遍运用于咱们身边形形色色的软件中。架构

聊天、直播、在线客服、物联网等全部须要实时互动、高实时性的场景等等,都须要应用到 IM 技术。并发

下面这些场景是咱们你们都熟悉的,都用到了IM技术:socket

  • 1)微信、qq、钉钉等主流IM应用:这是IM技术的典型应用场景;
  • 2)微博、知乎等社区应用:它们利用IM技术实现了用户私信等点对点聊天;
  • 3)抖音、快手等直播/短视频应用:它们利用IM技术实现了与主播的实时互动;
  • 4)米家等智能家居物联网应用:利用IM技术实现实时控制、远程监控等;
  • 5)滴滴、Uber等共享家通类应用:利用IM技术实现位置共享;
  • 6)在线教育类应用:利用IM技术实如今线白板。 

四、IM的典型架构

一个典型的IM架构相似于下图这样:

本图引用自《即时消息技术剖析与实战》学习笔记1——IM系统的架构》一文

如上图所示,IM架构中的各分层职责以下:

  • 1)客户端:做为与服务端进行消息收发通讯的终端;
  • 2)接入层:也叫网关层,为客户端收发消息提供入口;
  • 3)逻辑层:负责IM系统各功能的核心逻辑实现;
  • 4)存储层:负责IM系统相关数据的持久化存储,包括消息内容、帐号信息、社交关系链等;
  • 5)第三方服务:保证APP在未打开或后台运行时也能收到消息通知(这主要是第第3方消息推送服务)。

尤为对于“接入层”,它的职责最为关键,具体是:

  • 1)保持海量用户链接;
  • 2)解析协议,对传输内容进行编解码;
  • 3)维护客户端的链接(也叫“Session”);
  • 4)推送消息。

五、IM技术的特色

IM技术的特色主要就是如下4点: 

▶ 1)实时性:

对于IM系统,“实时”二字是精髓,也是这项技术存在关键意义所在。它保证的是消息的实时触达。

举个例子:若是跟你的好友微信或qq聊天,我发的消息他不能即时收到,或者他发的信息你也不知道何时能收到,这基本上也就无法聊下去了(干嘛不痛快打个电话呢)。

▶ 2)可靠性:

保证消息的不丢失和不重复,是IM系统的另外一个关键技术特色。试想,当你在用qq或微信跟女友聊天,好不容易鼓起勇气向“她”表白,结果这消息要是丢包了,那确定得卸载应用了,搞很差砸手机都有可能。固然,好话不说二遍,消息重复也一样恼人。

如下文章对消息的不丢/不重问题进行了深刻探讨,有兴趣能够详读:

▶ 3)一致性:

对于单聊消息而言,保证同一个设备的时间顺序、不一样设备的漫游同步,也是至关重要的一环。

IM系统中的消息交互,就到底就是人跟人在“说话”,前言不搭理后言、或者胡言乱语式的消息展示,那不是人疯了就是程序疯了,总之就是无法再聊下去了。

如下文章对消息时序问题进行了深刻探讨,有兴趣能够详读:

▶ 4)安全性:

保证数据传输安全、数据存储安全、消息内容安全,也是IM系统必不可少的特性。尤为在私聊场景下,若是不能作到安全性,聊天的体验跟被人偷窥的感受是没有区别的。

六、IM的功能组成

浅显的角度讲,一个典型的IM功能组成,无非就是如下5样:

  • 1)联系人列表;
  • 2)聊天界面;
  • 3)消息发送通道;
  • 4)消息接收通道;
  • 5)消息存储;
  • 6)消息未读数。

咱们同样同样来讲说各自的用途。

▶ 1)联系人列表:

这个很好理解,使用IM系统的第一步,就是要解决“跟谁聊”的问题。从功能表象上来讲,联系人列表也就是社交关系列表,无非就是个信息列表界面,有什么特殊的地方?

联系人列表看似简单,实际上它是一系列IM系统的社交关系确立动做的结果体现。

要想创建联系人列表,你可能须要实现如下逻辑:

  • 1)怎么能找到想要聊天的人?(须要实现随机查找?精确查找?)
  • 2)怎么决定要不要跟这我的聊?(须要实现对方的我的信息查看)
  • 3)开始发出好友请求;
  • 4)被请求的一方,还能够决定是“赞成”仍是“拒绝”(“赞成”该怎么处理?“拒绝”又该怎么处理?)。

总的来讲,联系人列表的创建,是一个IM系统聊天关系确立的表现,不可或缺。

▶ 2)聊天界面: 

聊天界面看似很日常,实际它就是IM系统客户端的核心功能所在,全部主要的IM功能都是经过它展示。

它应该具有的能力有:

  • 1)各类聊天功能按钮:语音留言、图片、文字、表情、文件、实时电话、实时视频等;
  • 2)各类聊天消息显示:各类消息都有不一样的UI显示元素和处理逻辑;
  • 3)流畅的使用体验:大量不一样类型的消息显示时,不能卡顿;
  • 4)即时显示聊天消息:网络线程收到的消息,要立刻在UI上显示出来;
  • 5)历史消息的加载:上次聊过的内容也得显示出来吧。

以上只是简单罗列,这看似简单的聊天界面,能把上面列表的事情作好,工做量也不小吧。

▶ 3)消息发送通道:

下图是一个典型的IM消息收发通道示意: 

如上图所示,消息发送通道这个比较好懂,最浅显易懂的理解就是用tcp或udp,创建socket长链接,须要发消息的时候,wirte一下就过去了,好简单!

但,事情每每不是想象的这么简单:

  • 1)如何保证这条socket长链接时一直处于可用的状态?
  • 2)当socket长链接不可用时,用户此时发送的消息该怎么处理?
  • 3)怎么保证发送的消息不丢?
  • 4)怎么保证发送的消息不复重?
  • 5)怎么保证发送的消息乱序?
  • 6)当对方不在线时,发送的消息去哪了?
  • 7)发送的消息,能保证明时送到?

这么一说,事情还挺多(那不废话吗。。。)。

▶ 4)消息接收通道:

正如上节中的消息收发通道示意图所示,消息接收通道也很好理解,对方经过消息发送通道write的消息,我得收到并显示啊。

要实现一个可靠的消息接收通道,也并不是易事:

  • 1)如何保证socket长链接通道能随时处于良好的边接状态(随时接收对方write的消息);
  • 2)当socket长链接断开时,对方发送消息该怎么实现?
  • 3)当socket恢复链接时,怎么恢复以前的聊天现场?
  • 4)当我收到对方的消息时,对方怎么知道我已经收到了?
  • 5)当重复收到对方的消息时,该怎么处理?
  • 6)当收到的消息时序有错乱,该怎么处理?

▶ 5)消息存储:

消息存储这个功能好理解,聊天的消息若是存储,下次再聊的时候就不知道以前聊过什么,作不到这一点,这个IM系统的聊天体验好不起来。

那么,哪些状况下须要进行消息存储呢:

  • 1)对方不在线时:聊天消息应该存储(这叫离线消息存储);
  • 2)对方在线时:聊天消息也要存到本地存储(这叫消息缓存);
  • 3)对方在线或不在线时:聊天消息都要存到服务端(用于实现多设备的消息漫游和同步)。

具体要存储的内容和时机也就上面这几样。

但技术落到实处,要作的事情一样少不了:

  • 1)离线消息该怎么多久?
  • 2)图片、短视频、大文件这类的离线消息,多媒体文件该怎么存(有可能量会很大)?
  • 3)当本地的消息积累太多时,怎么能保证本地存储的性能?
  • 4)当应用更新、升级或异常时,怎么能保证本地存储的完整性(不被破坏)?
  • 5)怎么能保证多设备消息能不丢、不重、不乱?

这么多须要考虑的内容,也挺让人抓狂。

下图是一个IM系统的典型存储架构设计,了解一下:

本图引用自《现代IM系统中聊天消息的同步和存储方案探讨》一文

▶ 6)消息未读数:

消息未读数?看起来也就是那个全部IM应用都有的未读小红点嘛。是的,看起来也好简单!

然而,消息未读数功能的实现也同样不简单:

  • 1)未读数是客户端实现仍是服务端实现?
  • 2)会话未读和总未读怎么保持一致?
  • 3)多终端状况下,怎么保证未读数的一致性(我在这台设备上读没读,那台设备怎么知道的?)?

是的,看起来就这么简简单单的3件事,但深刻思考一下,还真的简单不起来。

七、本文小结

IM系统的应用场景已经不仅仅是IM聊天应用这一种形态,它已经融入到互联网应用的方方面面,必竟谁都想自已的应用具有“实时”交互这种能力,由于体验太好了。

IM系统典型架构无非就是网络接入层、业务逻辑层、数据存储层,除开网络接入层,其它各层其实跟普通的应用系统看起来差异并非太大。

IM系统的技术特色来讲,就是实时性、可靠性、一致性、安全性,除了实时性对于多数应用来讲并不关心,其它的指标也很好理解。

IM系统的功能组成上,联系人列表用于数据模型的创建、聊天界面承载了IM系统的终端展示、消息的收发通道用于实现“实时”这个特性、存储和未读数看似不是必须但用户体验上确必不可少。(本文同步发布于:http://www.52im.net/thread-3065-1-1.html

相关文章
相关标签/搜索