什么是IM

IM即“即时(实时)消息技术”,是互联网实时互动场景的底层架构:包括聊天、直播、在线客服、物联网等这些业务领域在内,所有需要“实时互动”“高实时性”的场景,都需要、也应该用到 IM 技术。

im实际上是众多技术的组合,包括但不限于:网络,分布式应用,数据库,缓存,系统高可用等等

下面以一个简单的 App 聊天系统为例,来看下一个简单的聊天系统都有哪些构成要素,以此来了解一个完整的 IM 系统是什么样的。

从一个简单的聊天系统说起

我们可以从使用者和开发者两个角度来看一下

使用者眼中的聊天系统

如果我们站在一个使用者的角度从直观体验上来看,一个简单的聊天系统大概由以下元素组成:用户账号、账号关系、联系人列表、消息、聊天会话

  • 聊天的参与需要用户,所以需要有一个用户账号,用来给用户提供唯一标识,以及头像、昵称等可供设置的选项。
  • 账号和账号之间通过某些方式(比如加好友、互粉等)构成账号间的关系链
  • 你的好友列表或者聊天对象的列表,我们称为联系人的列表,其中你可以选择一个联系人进行聊天互动等操作。
  • 在聊天互动这个环节产生了消息
  • 同时你和对方之间的聊天消息记录就组成了一个聊天会话,在会话里能看到你们之间所有的互动消息

开发者眼中的聊天系统

从一个 IM 系统开发者的角度看,聊天系统大概由这几大部分组成:客户端、接入服务、业务处理服务、存储服务和外部接口服务。

  • 客户端

    • 客户端一般是用户用于收发消息的终端设备,内置的客户端和服务端进行网络通信,用来承载用户的互动请求和消息接收功能。
    • 我们可以把客户端想象为邮局业务的前台,它负责把你的信收走,放到传输管道中
  • 接入服务
    • 接入服务可以认为是服务端的门户,为客户端提供消息收发的出入口。发送的消息先由客户端通过网络给到接入服务,然后再由接入服务递交给业务层进行处理
    • 接入服务主要有四块功能:连接保持、协议解析、Session 维护和消息推送。
    • 我们可以把接入服务想象成一个信件管道,联通了邮局的前台和信件分拨中心。但是实际上,接入服务的作用很大,不仅仅只有保持连接和消息传递功能
    • 当服务端有消息需要推送给客户端时,也是将经过业务层处理的消息先递交给接入层,再由接入层通过网络发送到客户端
    • 此外,在很多基于私有通信协议的IM系统实现中,接入服务还提供协议的编解码工作,编解码实际主要是为了节省网络流量,系统会针对传输的内容进行紧凑的编码(比如protobuf),为了让业务处理时不需要关系这些业务无关的编解码工作,一般由接入层来处理
    • 此外,还有session维护的工作很多时候也是由接入服务来实现,session的作用是标识“哪个用户在哪个TCP连接”,用于后继的消息推送能够知道,如何找到接收人对应的连接来发送
    • 另外,接入服务还负责最终消息的推送执行,也就是通过网络连接把最终的消息从服务器传输到用户的设备上
  • 业务处理服务
    • 业务处理服务是真正的消息业务逻辑处理层,比如消息的存储、未读数的变更、更新最近联系人等,这些都是业务处理的范畴
    • 我们可以想象得到,业务处理服务是整个IM系统的中枢大脑,负责各种复杂业务逻辑的处理
    • 就好比你的信到达分拨中心后,分拨中心可能需要给接收人发条短信告知一下,或者分拨中心发现接收人告知过要拒绝接收这个发送者的任何信件,因此会在这里直接把信件退回给发信人。
  • 存储服务
    • 账户信息、关系链,以及消息本身,都需要进行持久化存储
    • 另外一般还有一些用户相关的设置,也会进行服务端存储,用户可以设置不接收某些人的消息。
    • 我们可以把它理解成辖区内所有人的通信地址簿,以及储存信件的仓库
  • 外部接口服务
    • 由于手机操作系统的限制,以及资源优化的考虑,大部分App在进程关闭,或者长时间后台运行时,App和IM服务端的连接会被手机操作系统断开。这样当有新的消息产生时,就没法通过IM服务再触达用户,因而会影响用户体验
    • 为了让用户在App未打开,或者在后台运行时,也能接收到新消息,我们会将消息给到第三方外部接口服务,来通过手机操作系统自身的公共连接服务来进行操作系统级的“消息推送”,通过这种方式下发的消息一般会在手机的“通知栏”对用户进行提醒和展示
    • 这种最常用的第三方系统推送服务有苹果手机自带的 APNs(Apple Push Notification service)服务、安卓手机内置的谷歌公司的 GCM(Google Cloud Messaging)服务等。但 GCM 服务在国内无法使用,为此很多国内手机厂商在各自手机系统中,也提供类似的公共系统推送服务,如小米、华为、OPPO、vivo 等手机厂商都有相应的 SDK 提供支持。

问题:接入服务的主要是为客户端提供消息收发的出入口,而业务处理服务主要是处理各种聊天消息的业务逻辑,这两个服务理论上进行合并好像也没有什么不妥,但大部分 IM 系统的实现上,却基本上都会按照这种方式进行拆分。为什么接入服务和业务处理服务要独立拆分呢?

回答:

  • 第一点:接入服务作为消息收发的出入口,必须是一个高可用的服务,保持足够的稳定性是一个必要条件

    • 试想一下,如果连接服务总出于不稳定状态,老是出现连不上或者频繁断连的情况,一定会大大影响聊天的流畅性和用户体验
    • 而业务处理服务由于随着产品需求迭代,变更非常频繁,随时有新业务需要上线重启
    • 如果消息收发接入和业务逻辑处理都在一起,势必会让接入模块随着业务逻辑的变更上线,导致已通过网络接入的客户端连接经常性的断连、重置、重连
    • 这种连接成的不稳定性会导致消息下推不及时,消息发送流畅性差,甚至会导致消息发送失败,从而降低用户收发消息的体验
    • 所以,将“只负责网络通道维持,不参与业务逻辑,不需要频繁变更的接入层”独立出来,不管业务逻辑如何调整变化,都不需要接入层进行变更,这样能保证连接池的稳定性,从而整体上提升消息收发的用户体验
  • 第二点:从业务开发人员的角度看,接入服务和业务处理服务进行拆分有助于提升业务开发效率,降低业务开发门槛
    • 模块拆分后,接入服务负责处理一切网络通信相关的部分,比如网络的稳定性、通信协议的编解码等。
    • 这样负责业务开发的同事就可以更加专注于业务逻辑的处理,而不用关心网络问题和通信协议了

IM系统有哪些特性

上面我们从使用者和从业者两个角度,分别了解一个完整 IM 系统的构成,接下来我们和其他系统对比着来看一下,从业务需求出发,IM 系统都有哪些不一样的特性。

实时性

对于一个实时消息系统,“实时”二字很好地表达了这个系统的基本要求。

通过微信和你的好友聊天,结果等半天对方才收到,基本上也没有意愿聊了;直播场景下,如果主播的互动消息房间里的粉丝要等很长时间才能收到,也很难让粉丝们有积极参与的欲望。

可靠性

如果说“实时性”是即时消息被广泛应用于各种社交、互动领域的基本前置条件,那么消息的可靠性则是实时消息服务可以“被信赖”的另一个重要特性。

这里的可靠性通俗来讲,一般包括两个方面。

  • 不丢消息。“丢消息”是互动中让人难以接受的 Bug,某些场景下可能导致业务可用性差,甚至不可用的情况。比如直播间“全员禁言”的信令消息丢失,就可能导致直播室不可控的一些情况。
  • 消息不重复。消息重复不仅会对用户造成不必要的骚扰和困惑,可能还会导致比较严重的业务异常,比如直播间“送礼物”的消息由于某种原因被重复发出,处理不妥的话可能会导致用户损失。

一致性

消息的一致性一般是指:同一条消息,在多人、多终端需要保证展现顺序的一致性。

比如,对于单聊场景,一致性是指希望发送方的消息发送顺序和接收方的接收顺序保持一致;而对于一个群的某一条消息,我们希望群里其他人接收到的消息顺序都是一致的;对于同一个用户的多台终端设备,我们希望发送给这个用户的消息在多台设备上也能保持一致性。

缺少“一致性”保障的 IM 系统,经常会导致双方沟通过程中出现一些“奇妙的误会”,语言乱序相关的“惨案”。网络上,你可以想象一下发给下属、领导或合作方的几条重要工作内容,如果消息错乱了,后果可能会比较严重。

安全性

由于即时消息被广泛应用于各种私密社交和小范围圈子社交,因此用户对于系统的隐私保护能力要求也相对较高。

从系统使用安全性的角度来看,首先是要求“数据传输安全”,其次是要求“数据存储安全”,最后就是“消息内容安全”。

即时消息:一个完整的IM系统是怎样的相关推荐

  1. 一个完整的搜索系统 - God bless you - 博客园

    一个完整的搜索系统 - God bless you - 博客园 一个完整的搜索系统 - God bless you - 博客园 一个完整的搜索系统 一个完整的搜索系统 层次型倒排索引 基于前面非精确t ...

  2. 一个完整的crm系统都应该具备哪些功能?

    "CRM系统是一道开放性题目,它没有固定答案." 这句话一定要牢牢记住,不仅是CRM系统,它适用于所有系统. 企业想要弄清楚一个完整的CRM系统应该具备哪些功能,首先得清楚CRM系 ...

  3. 一款高颜值的医院信息系统,致力于打造一个完整的医疗系统!

    责编:猿哥 | 来源:GitHub猿 整理 我今天,推荐一个系统项目.猿哥第一次使用就有点上头,爱不释手,必须要推荐给大家. 上次是谁要的系统项目啊,猿哥帮你找到了. 这是我目前见过最好的系统项目.功 ...

  4. SpringBoot+Vue 完整的外卖系统,手机端和后台管理,可以玩一下!

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 flash-waimai 一个 ...

  5. SpringBoot+Vue 完整的外卖系统,手机端和后台管理

    flash-waimai 一个完整的外卖系统,包括手机端,后台管理,api 基于spring boot和vue的前后端分离的外卖系统 包含完整的手机端,后台管理功能 本项目主要供交流学习,不建议商用. ...

  6. Spring Boot Vue完整的外卖系统,手机端和后台管理api 源码赠送

    flash-waimai 一个完整的外卖系统,包括手机端,后台管理,api 基于spring boot和vue的前后端分离的外卖系统 包含完整的手机端,后台管理功能 本项目主要供交流学习,不建议商用. ...

  7. 完整的外卖系统,手机端 + 后台管理(附源码)

    点击上方"逆锋起笔",公众号回复 编程资源 领取大佬们推荐的学习资料 flash-waimai 一个完整的外卖系统,包括手机端,后台管理,api 基于spring boot和vue ...

  8. 如何快速搭建一个完整的移动直播系统?

    **如何快速搭建一个完整的移动直播系统?** 原文连接:http://toutiao.com/a6301796359717945601/ http://toutiao.com/a62784095597 ...

  9. 一个完整的微服务系统,应该包含哪些功能?--转

    原文地址:http://chuansong.me/n/405417651660 近几年,微服务架构迅速在整个技术社区窜红,它被认为是IT软件架构的未来方向,大神Martin Fowler也给微服务极高 ...

最新文章

  1. Angular No name was provided for external module 'XXX' in output.globals 错误
  2. SharePoint 沙盒解决方案 VS 场解决方案
  3. python玩装虎牙直播自动登录发弹幕
  4. python装饰器 property_python中property和setter装饰器用法
  5. 你应该关注的几个网站
  6. 计算机基础是高校必修课,高校计算机基础教育教学方式改革
  7. Django知识总结
  8. 如何设计实时数据平台(技术篇)
  9. linux cisco路由器,Linux用dynamic模拟cisco路由器
  10. ***测试执行标准(Penetration Testing Execution Standard:PTES)
  11. Windows Knowledge
  12. Nodejs 获取本机IP地址
  13. 《Python渗透测试编程技术:方法与实践》:信息的利用(进阶)
  14. 生成Xcode中各个尺寸的Mac App Icon
  15. HBuilderX配置自动格式化,统一代码规范
  16. 【科学文献计量】知识单元的频次统计与分布(简单阅览和完整频次统计)
  17. 问题描述:the jar file jrt-fs.jar has no source attachment
  18. springboot+shiro+nutz+beetl + mysql
  19. matlab批量读取图像图片并批量处理图像(以伽马校正为例)以及批量保存图像
  20. Python二级--命运-3

热门文章

  1. LabVIEW的移位寄存器
  2. MAC下终极 Shell——ZSH
  3. PPS优化安装版和暴风影音优化安装版
  4. Removing Smallest Multiples
  5. gif透明背景动画_如何将AVI转换为GIF
  6. java学习记录16-反射
  7. 付费订阅故事难讲,腾讯音乐如何“过河”?
  8. 18 - JavaScript 包装类
  9. 普及共享出行理念 嘀嗒出行倡导出行信用建设
  10. 浅谈JCenter即将被停止服务的事件