IM系统的简单介绍

news/2024/10/18 16:46:27/

         作为一个互联网时代的公司无论你的产品是什么,你都需要一个网站还是app亦或是一个pc软件作为自己的网络平台,而在网络平台当中,即时收集用户反馈、与用户进行互动、方便用户之间互动提高产品活跃度只要存在这些需求,那么你的产品都需要IM(即时通信)的能力。
        既然大家都需要一个用户之间/用户与客服之间的简单即时通信(IM)能力,那么如何获得一个这样的能力成为不少成长型公司的巨大的问题。如果将这样的能力接入其他公司的成熟系统,当然市场上的产品完全能够满足要求,但是无可避免的需要付出部分代价:IM服务的提供方将会完全掌握你们之间的通信信息,这个无论对方如何承诺安全性和专业性都是无法避免的(后续有机会专门讲述一下安全性问题)。
       本篇的核心就在介绍IM通信系统最核心、最简单的功能和架构。
       首先简述本文认为的IM通信的最基础的两大功能:
       (1)确保发送端能够完成信息发送
       (2)确保接收者能够即时准确地接收到信息
       也就是消息推送的及时性和可靠性,其次则为设备漫游、多端同步以及安全性问题。(这里吐槽一句在深入了解了某信之后我发现:对于大的业务方有些问题可能都不需要解决)
       接下来就是IM系统的实现方式:
        这里引入在中国市场中最大的两个即时通信app是某信和某Q,以他们为例进行介绍,虽然两者都是某讯公司的产品,但实际上从设计理念/模型上便有着根本上的差异。
        某Q是一种相对较为经典的IM工具,其最为古老的版本是1999年便出现的OICQ。作为一个上一个世纪便产生的互联网行业的老古董,其不可避免经历过多次的大改以修复某些原始设计上的缺陷,确保产品体验和服务性能。但这么多次修改其设计的基本理念并没有大改,用户发送消息实际上是在向中心服务器写入信息,消息写入之后,接收端同样是通过中心服务器来获得消息内容,总体上是一种数据中心化存储+读扩散的模式。
       与之相对应的是2011年才面向市场某信,虽然诞生至今不过十年,但已经成为了消息量最大的社交软件。微信的设计理念来自于短信/电子邮箱模式,用户发送消息实际上是在编辑一条短信/邮件,通过某信的服务再将内容投递出去,这中间可能存在多次转发,但最终的投递地点/终端是固定的,这种设计思路在IM中相对少见,总体上是一种分散存储+写扩散的模式。
       整体的设计思路:


(1)中心化读扩散的模式


(2)去中心化写扩散的模式
PS:上述只是一个模式差异的简略图,实际的结构复杂度将远远超过这张简图

       两种模式区别实际上相当明显:
       (1)中心化读扩散的模式,很难实现异地多活的场景,对于远离中心的“域外”支持力有限,超长距离通信非常不方便
       (2)去中心化写扩散的模式,难以支持多端同步,写扩散造成的存储成本使得服务端存储变得不太现实,跨区域获取数据场景处理非常麻烦
       了解了这些你可能就明白了某些主要用作IM的软件一些奇奇怪怪的规则,比如某些软件为什么只能单端登录。
       消息发送成功之后并不是万事大吉了,IM系统仍然需要确保消息触达到用户。
       仍然拿上述的某信/某Q为例,简述IM系统推送信息的两种模式,主要的方式是:
       (1)当用户在线的时候,服务端主动推送消息,也就是推的模式(push)
       (2)当用户不在线的时候,服务器暂存消息,用户断线重连之后,客户端主动拉的模式(pull)
       当前的主流IM软件当前都是使用的push/pull相结合的消息获取方式,某信和某Q和不能例外,其中要说差别,我只能说某信的用户在线时间明显高于某Q,也就是一个用推的场景更多一些,而另一个使用拉的场景更多。
       再进一步阐述之前,这里要引入一个长连接的概念,而上文所提到的用户在线状态更多的指的并不是用户是否连接上了网络,也不是用户是否打开了特定的软件,而是指的用户是否连接了特定的长链接服务。
       先上定义:长连接,指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。
       长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。其好处是显而易见的:节约了多次TCP的握手分手的一系列动作,减少频繁的通信会造成socket错误。
       常见的长连接方案包括:comet、WebSocket等。
       对于IM系统而言长连接有一些特殊的意义和作用:
       (1)建立的长连接通道,方便了服务端主动向下推送消息
       (2)建立长连接的过程中可以方便的获得设备的信息和设备的连接状态
       IM的客户端和长连接之间的互动流程包括:
       (1)客户端登陆,尝试连接长连接服务端
       (2)长连接服务响应,双方连接成功
       (3)客户端注册客户端相关信息(ip,版本,用户信息等等),长连接校验信息,成功后客户端在长连接中注册完毕
       (4)客户端主动获取断线过程中丢失的信息
       (5)长连接处理多个客户端之间的通信信息
       大体的流程图:

       加入长连接之后的客户端之间通信方案:

        至此,消息发送/接收这两个IM最核心的流程,以及客户端、长连接、服务端这三个IM最重要的三个部分之间关系全部介绍完毕,这个IM的大框架也就基本介绍完成,后续的细节就不在本篇中赘述了。

    写在最后感谢某信和某Q作为本文的素材


http://www.ppmy.cn/news/653104.html

相关文章

开源轻量级 IM 框架 MobileIMSDK v6.2 发布

一、更新内容简介 本次更新为次要版本更新,进行了若干优化(更新历史详见:码云 Release Nodes)。可能是市面上唯一同时支持 UDPTCPWebSocket 三种协议的同类开源IM框架。 二、MobileIMSDK简介 MobileIMSDK 是一套专为移动端开发的…

基于Netty,从零开发IM:编码实践篇(im单聊功能)

引言 本篇主要讲解的是通过实战编码实现IM的单聊功能,内容涉及技术原理、编码实践。 补充说明:因为本系列文章主要目的是引导IM初学者在基于Netty的情况下,如何一步一步从零写出IM的逻辑和思维能力,因而为了简化编码实现&#xf…

IM即时通讯聊天软件1.0

一、项目简介 一直以来都有一个社交梦,想做一款IM应用,看了很多优秀的开源项目,但是没有合适的。于是利用休息时间自己写了这么一套系统。 项目第一个版本历时2个月,前端使用uniapp,后端使用SpringBoot。 页面设计后期…

im即时通讯源码/uniapp即时通讯im源码附视频安装教程

即时通讯im源码使用ThinkPHP7和Swoole构建的简单、美观、移动优先的即时消息渐进式 Web 应用程序。   仓库源码:im.jstxym.top   本文目录:   ●点击展开   ●安装   ●依赖项   ●源代码构建   ●用法   ●发布 安装   默认情况下&am…

收藏-即时通讯(IM)开源项目OpenIM-功能手册

OpenIM简介 OpenIM是由IM技术专家打造的开源即时通讯组件,也是目前最受欢迎的开源IM项目之一,目前github star近万。开发者通过集成OpenIM组件,并私有化部署服务端,可以将即时通讯、实时通讯能力快速集成到自身应用中&#xff0c…

IM 即时通讯实战:环信Web IM极速集成

前置技能 Node.js 环境已搭建。npm 包管理工具的基本使用。Vue2 或者 Vue3 框架基本掌握或使用。 学习目标 项目中集成 IM 即时通讯实战利用环信 IM Web SDK 快速实现在 Vue.js 中发送出一条 Hello World! 一、了解环信 IM 什么是环信 IM? 环信即时通讯为开发者…

开源即时通讯IM框架 MobileIMSDK v6.3 发布

一、更新内容简介 本次更新为次要版本更新,进行了若干优化(更新历史详见:码云 Release Nodes)。可能是市面上唯一同时支持UDPTCPWebSocket 三种协议的同类开源IM框架。 二、MobileIMSDK简介 MobileIMSDK是一套专为移动端开发的原创…

victoriametrics 时序数据库概述

目录标题 victoriametrics 时序数据库的组成victoriametrics 常用的查询指令 victoriametrics 时序数据库的组成 VictoriaMetrics 存储数据的数据结构主要由以下几个方面组成: Metric 标识符(Metric Identifier):Metric 标识符是…