IM系统(即时通讯系统)初识

news2024/9/18 23:47:37

文章目录

  • IM系统概述
    • 即时通讯应用和即时通讯系统
  • 现有系统添加IM功能
    • 早期即时通讯系统架构
    • 即时通讯系统的基本组成
    • 当代即时通讯系统常用架构

IM系统概述

  • IM是即时通讯的缩写,它指的是一种网络通讯技术,可以让用户在网络上进行实时的文字、语音、视频等多种形式的交流和沟通。IM技术可以让用户在不同的地点、不同的时间实现即时通讯,方便了人们的沟通和交流。
  • IM(Instant Messaging)系统通常包括客户端软件和服务器端软件,用户可以通过客户端软件连接服务器,实现与其他用户的即时通讯。常见的IM系统包括QQ、微信、Skype、WhatsApp等。

即时通讯应用和即时通讯系统

  • 即时通讯应用是一种可以实时交流信息的软件应用程序,例如WeChat、QQ等。应用程序通常提供文字、语音、图片和视频等多种形式的信息交流方。

  • 即时通讯系统则是一种基于计算机网络的软件系统,用于实现即时通讯应用程序的功能。即时通讯系统通常由服务器和客户端组成,服务器用于处理用户之间的通讯请求和消息传递,客户端则是用户使用的应用程序。
    在这里插入图片描述

现有系统添加IM功能

实现方式有三种:

  1. 使用开源产品做二次开发或直接使用
  2. 使用付费的云服务商
  3. 使用自研
实现方式优点缺点
使用开源产品做二次开发或直接使用- 开源产品通常有较好的稳定性和安全性。
- 可以根据需求进行二次开发,定制化程度高。
- 开源产品通常免费或价格较低。
- 需要有一定的技术能力来进行二次开发和维护。
- 开源产品可能存在一些限制,如并发量、性能等。
使用付费的云服务商- 云服务商通常有较好的稳定性和安全性。
- 无需自行搭建服务器和维护,节省了成本和人力。
- 可以根据需求选择不同的服务套餐,灵活性高。
- 依赖于云服务商的服务质量和稳定性。
- 可能会存在一些限制,如并发量、性能等。
使用自研- 可以根据需求进行定制化开发,灵活性高。
- 可以完全掌控系统的安全性和稳定性。
- 需要有较高的技术能力和资源。
- 需要考虑到服务器的部署、维护和安全性等问题。

早期即时通讯系统架构

在这里插入图片描述

  • 长轮询是一种早期的即时通讯系统实现方式,它的基本原理是客户端向服务器发送一个请求,服务器在等待有新消息到来时才返回响应。如果服务器没有新消息,就会等待一段时间后再返回响应,客户端再次发送请求,如此循环。

长轮询的优点:

  1. 实现简单:长轮询的实现比较简单,只需要客户端和服务器之间进行HTTP请求和响应即可。
  2. 可靠性高:长轮询可以保证消息的可靠性,因为客户端只有在服务器有新消息时才会收到响应。
  3. 兼容性好:长轮询可以在大多数浏览器和操作系统上运行,兼容性较好。
    长轮询的缺点:
  4. 实时性差:长轮询需要等待一段时间才能返回响应,实时性较差,无法满足高实时性的应用场景。
  5. 资源浪费:长轮询需要客户端频繁地向服务器发送请求,服务器需要维护大量的长连接,会浪费服务器资源。
  6. 延迟高:长轮询的延迟较高,因为客户端需要等待一段时间才能收到响应。
  • 长轮询的优点是实现简单、可靠性高、兼容性好,缺点是实时性差、资源浪费、延迟高。在现代的即时通讯系统中,长轮询已经被WebSocket等更高效的实现方式所取代。

即时通讯系统的基本组成

  • 一套即时通讯系统的基本组成包括客户端、接入层、逻辑层和存储层
    在这里插入图片描述
  1. 客户端:用户通过客户端进行消息的发送和接收。客户端可以是基于桌面、移动设备或网页等不同平台的应用程序,提供文字、语音、图片和视频等多种形式的信息交流方式。

  2. 接入层:负责处理客户端和服务器之间的通讯请求和消息传递。接入层可以使用HTTP、WebSocket等不同的网络协议来实现消息传递,同时可以支持多种客户端协议,例如XMPP、MQTT等。

  3. 逻辑层:即时通讯系统的核心负责处理用户之间的通讯请求和消息传递,包括用户认证、消息传递、在线状态管理等功能。逻辑层可以使用Java、Python、C++等不同的编程语言,同时可以使用一些框架和工具来加速开发,例如Netty、Spring、Django等。

  4. 存储层:即时通讯系统的数据存储层,用于存储用户信息、聊天记录等数据。存储层可以使用关系型数据库(如MySQL、PostgreSQL等)或NoSQL数据库(如MongoDB、Redis等),同时可以使用一些缓存技术来提高系统的性能和可扩展性。

  • 综上所述,一套即时通讯系统的基本组成包括客户端、接入层、逻辑层和存储层,它们各自承担不同的功能,协同工作来实现即时通讯系统的各种功能。

当代即时通讯系统常用架构

在这里插入图片描述

  • 服务端拆分成接入层和逻辑层

    • 接入层负责收集客户端发来的消息,交替给逻辑层处理,当逻辑层处理完消息后,也是通过接入层将处理过后的消息投递给客户端。接入层可以认为是im系统中的门户,是整个im系统中较为核心的一块。维护着服务端与客户端的长连接,为客户端提供消息收发的入口。接入层主要分为四个功能:保持长连接、协议解析、筛选维护、消息推送
    • 逻辑层需要保证消息不丢不漏不串。最基本的im系统包含用户关系链群组消息作为基础模块,几大基础模块为消息的投递奠定了基本的逻辑交互。比如:用户a给用户b发送消息,是否需要好友关系才能发送消息?如果是群聊消息,那么用户是否在群内?这个群是否开启禁言?这些都需要逻辑层配合接入层去实现。
  • 存储层负责数据的持久化

    • 关系型数据库是目前程序开发中最首选的一种存储介质,在保存用户关系链群组,这类关系型数据不在话下。
      聊天记录这类数据在做好分布分表之后,也能存下海量的数据。但是,对于热点数据查询频率过高的离线消息,关系型数据库就不太合适,可以考虑另一种存储介质,如:redis

  • 数据在当代即时通讯系统流转过程分析:客户端发送消息给接入层,接入层发送给逻辑层,逻辑层处理之后进行持久化,持久化后返回给接入层,接入层再路由给客户端。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1305446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年第三季度全球SSD出货量环比增长24%,市场复苏!

根据Trendfocus发布的研究报告显示:2023年第三季度全球SSD出货量环比增长24%,达到9306万pcs,出货容量也增长了21%,达到7769EB。三星出货量市场TOP1,其次是WDC西部数据、金士顿、镁光Micron、海力士等。 由于PC OEM连续…

Leetcode—509.斐波那契数【简单】

2023每日刷题(五十七) Leetcode—509.斐波那契数 实现代码 int fib(int n){if(n 0) {return 0;}if(n 1) {return 1;}return fib(n-1) fib(n-2); }运行结果 之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点…

免费素材网站合集,设计师赶快收藏

设计师通常去哪里找设计素材? 寻找高质量、免费的设计素材,给大家总结了15个网站,平面、UI、电商、网页等都可以找到不错的设计素材,赶紧收藏一波~ 即时设计资源广场 即时设计资源广场拥有数万件来自优秀设计师的精美设计作品&a…

高中生应该及早接触职业性格测试

性格是我们成长过程中日渐形成的、固有的特征和行为习惯,性格跟我们的成长环境有很大的关系,比如父母的教养方式,父母的性格特征,以及我们的朋友关系,课堂学习,知识积累。这是一个无数层面的综合。 每个人…

ARM day7

题目1&#xff1a;按键中断代码编写 代码&#xff1a; main.c #include "key_it.h"#include "led.h"void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j);}}int main(){myall_led_init();key1_it_config();key2_it_config();key3_it_conf…

PPT制作的几个注意事项

PPT制作的几个注意事项 字数不可过多字体大小字体颜色排版问题PPT篇末致谢什么是好的PPT关于演讲不要念PPT说话时面向观众。讲话的时候抖腿其他 事先声明&#xff1a; 以下展示的PPT就PPT制作技巧而言&#xff0c;与其内容无关。 字数不可过多 做PPT最忌讳的就是满篇全是文字&…

宝塔 Warning: require(): open_basedir restriction in effect

去掉网站目录下的勾选&#xff0c;防跨站攻击&#xff08;open_basedir&#xff09;,然后重启php服务。

Enabling Application Engine Tracing 启用应用程序引擎跟踪

Enabling Application Engine Tracing 启用应用程序引擎跟踪 By default, all Application Engine traces are turned off. To see a trace or a combination of traces, set trace options before you run a program. 默认情况下&#xff0c;所有应用程序引擎跟踪都处于关闭…

kernel(二):启动内核

本文主要探讨210内核启动过程。 主Makefile 定义kernel版本号(2.6.35.7) VERSION 2PATCHLEVEL 6SUBLEVEL 35EXTRAVERSION .7 指定编译文件生成目录 make O/tmp 定义交叉编译工具链 CROSS_COMPILE ? /root/arm-2009q3/bin/arm-none-linux-gnueabi- 指定架构 ARCH …

网络安全公司梳理,看F5如何实现安全基因扩增

应用无处不在的当下&#xff0c;从传统应用到现代应用再到边缘、多云、多中心的安全防护&#xff0c;安全已成为企业数字化转型中的首要挑战。根据IDC2023年《全球网络安全支出指南》&#xff0c;2022年度中国网络安全支出规模137.6亿美元&#xff0c;增速位列全球第一。有专家…

「PPT 下载」Google DevFest Keynote | 复杂的海外网络环境下,如何提升连接质量

&#xff08;全网都在找的《社交泛娱乐出海作战地图》&#xff0c;点击获取&#x1f446;&#xff09; 12 月 10 日&#xff0c;“Google DevFest 2023 上海站”大会如期在上海市东方万国宴会中心举办。延续过往的技术交流碰撞、前沿技术学习基调传统&#xff0c;本届大会聚焦行…

CS110L 系统编程安全 笔记

用户向程序输入数据&#xff0c;程序分析数据&#xff0c;但是当用户的输入大于缓冲区长度时&#xff0c;数据会溢出&#xff0c;覆盖掉内存中其他内容&#xff0c;比如函数返回地址&#xff0c;从而可能导致程序返回到错误的地址执行了不安全的程序&#xff08;远程代码执行&a…

每日一练2023.12.6——Left-pad【PTA】

题目链接&#xff1a;L1-032 Left-pad 题目要求&#xff1a; 根据新浪微博上的消息&#xff0c;有一位开发者不满NPM&#xff08;Node Package Manager&#xff09;的做法&#xff0c;收回了自己的开源代码&#xff0c;其中包括一个叫left-pad的模块&#xff0c;就是这个模块…

C++STL库的 deque、stack、queue、list、set/multiset、map/multimap

deque 容器 Vector 容器是单向开口的连续内存空间&#xff0c; deque 则是一种双向开口的连续线性空 间。所谓的双向开口&#xff0c;意思是可以在头尾两端分别做元素的插入和删除操作&#xff0c;当然&#xff0c; vector 容器也可以在头尾两端插入元素&#xff0c;但是在其…

bug-ku--计算器

F12 maxlength"1" 限制的是你能输入几位数 改成3就行 来那个数相相加就能输入了 flag{464f5f406e7e182014500fc49f7aedfc}

Mybatis核心配置文件加载流程详解

Mybatis核心配置文件加载流程详解 本文将介绍MyBatis在配置文件加载的过程中&#xff0c;如何加载核心配置文件、如何解析映射文件中的SQL语句以及每条SQL语句如何与映射接口的方法进行关联。 映射配置文件 在介绍核心配置文件加载流程前&#xff0c;先给出一个简单的MyBati…

geolife 笔记:将所有轨迹放入一个DataFrame

单条轨迹的处理&#xff1a;geolife笔记&#xff1a;整理处理单条轨迹-CSDN博客 1 加载数据 import pandas as pd import numpy as np import datetime as dt import osdata_dir Geolife Trajectories 1.3/Data/ 1.1 列出所有文件夹 dirlist os.listdir(data_dir) dirlist…

golang游戏服务器 - tgf系列课程06

游戏配置 使用框架提供的游戏配置工具,只要两步,开箱即用需求描述 沿用上一节课的案例, 创建道具表,通过道具id在道具服中获取配置中道具的名称Excel 创建配置表根据项目文档中进阶教程目录下ExcelToJson的教程文档,创建指定格式的Excel文件. 脚本 生成脚本 func main() {//…

luceda ipkiss教程 48:求线路中波导的总长度

当线路中有多条波导时&#xff0c;可以一次输出所有波导的总长度&#xff1a; 如&#xff1a; 代码如下&#xff1a; from si_fab import all as pdk from ipkiss3 import all as i3class MZI_Lattice(i3.Circuit):mmi i3.ChildCellProperty()mmi_spacing i3.PositiveNumb…

C++ 对象的初始化和清理:构造函数和析构函数

目录 构造函数和析构函数 构造函数 析构函数 构造函数的分类及调用 括号法 显示法 隐式转换法 拷贝构造函数的调用时机 使用一个已经创建完毕的对象来初始化一个新对象 值传递的方式给函数参数传值 以值方式返回局部对象 构造函数调用规则 初始化列表 类对象作…