《即时消息系统-IM核心技术》

IM 核心概念

用户:系统的使用者

消息:是指用户之间的沟通内容。通常在 IM 系统中,消息会有以下几类:文本消息、表情消息、图片消息、视频消息、文件消息等等

会话:通常指两个用户之间因聊天而建立起的关联

:通常指多个用户之间因聊天而建立起的关联

话题:通常指多个用户订阅了某个话题而简历起得关联

终端:指用户使用 IM 系统的机器。通常有 Android 端、iOS 端、Web 端等等

未读数:指用户还没读的消息数量

用户状态:指用户当前是在线、离线还是挂起等状态

关系链:是指用户与用户之间的关系,通常有单向的好友关系、双向的好友关系、关注关系等等。这里需要注意与会话的区别,用户只有在发起聊天时才产生会话,但关系并不需要聊天才能建立。对于关系链的存储,可以使用图数据库(Neo4j 等等),可以很自然地表达现实世界中的关系,易于建模

单聊:一对一聊天

群聊:多人聊天

客服:在电商、系统管理等服务领域,通常需要对用户提供使用咨询、售后咨询等服务。这时,就需要引入客服来处理用户的咨询

消息分流:在电商、系统管理等服务领域领域,一个商家通常会有多个客服,此时决定用户的咨询由哪个客服来处理就是消息分流。通常消息分流会根据一系列规则来确定消息会分流给哪个客服,例如客服是否在线(客服不在线的话需要重新分流给另一个客服)、该消息是售前咨询还是售后咨询、当前客服的繁忙程度等等

信箱:一个收发消息的队列,可以理解为邮局的信箱,存储待处理的信件、消息。

一:即时消息系统的基本架构

整体架构设计概览图:

  1. 使用者眼中的聊天系统

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

这个应该不难理解,我来解释一下。

  • 聊天的参与需要用户,所以需要有一个用户账号,用来给用户提供唯一标识,以及头像、昵称等可供设置的选项。账号和账号之间通过某些方式(比如加好友、互粉等)构成账号间的关系链。

  • 你的好友列表或者聊天对象的列表,我们称为联系人的列表,其中你可以选择一个联系人进行聊天互动等操作。

  • 在聊天互动这个环节产生了消息。

  • 同时你和对方之间的聊天消息记录就组成了一个聊天会话,在会话里能看到你们之间所有的互动消息。

  1. 开发者眼中的聊天系统

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

客户端:

客户端一般是用户用于收发消息的终端设备,内置的客户端程序和服务端进行网络通信,用来承载用户的互动请求和消息接收功能。大多数 IM 系统的客户端会负责:

  1. client每个设备会在本地存每一个会话,保留有最新一条消息的顺序 ID;

  2. 为了避免client宕机,也就是退出应用,保存在内存的消息ID丢失,会存到本地的文件中;

  3. client需要在本地维护一个等待ack队列,并配合timer超时机制,来记录哪些消息没有收到ack,以定时重发;

  4. 客户端本地生成一个递增序列号发送给服务器,用作保证发送顺序性。该序列号还用作ack队列收消息时候的移除。

接入服务:

接入服务可以认为是服务端的门户,为客户端提供消息收发的出入口。发送的消息先由客户端通过网络给到接入服务,然后再由接入服务递交到业务层进行处理。可以把接入服务想象成一个信件管道,联通了邮局的前台和信件分拨中心。

接入服务主要有四块功能:连接保持、协议解析、Session 维护和消息推送。

  1. 连接保持、协议解析、Session 维护和消息推送

在很多基于私有通信协议的 IM 系统实现中,接入服务还提供协议的编解码工作,编解码实际主要是为了节省网络流量,系统会针对传输的内容进行紧凑的编码(比如 Protobuf),为了让业务处理时不需要关心这些业务无关的编解码工作,一般由接入层来处理。

另外,还有 session 维护的工作很多时候也由接入服务来实现,session 的作用是标识“哪个用户在哪个 TCP 连接”,用于后续的消息推送能够知道,如何找到接收人对应的连接来发送。

  1. 接入层的高可用、负载均衡、扩展性

接入层是整个服务的门户,也是第一道防护,在接入做好攻击防护可以提高整个服务的安全性和稳定性。

业务处理服务:

消息系统的处理中枢,类比人的大脑,电脑的 CPU、GPU。大多数 IM 系统的业务会包含:

用户模块:负责注册、登录、密码、基本信息维护等业务;

用户关系模块:负责好友的添加、删除、拉黑,群组的创建、加入、踢出、解散等业务;

消息模块:这是 IM 最核心的业务模块,负责消息收发、存储调度,消息通知,消息未读数维护等等;

其他业务:例如 管理后台、红包、话题、部落、广场、朋友圈、活动等其他业务。

存储服务:

这个比较好理解,账号信息、关系链,以及消息本身,都需要进行持久化存储。

一般会用到关系型数据库、非关系型数据库、文件存储 OSS等。

外部接口服务:

由于手机操作系统的限制,以及资源优化的考虑,大部分 App 在进程关闭,或者长时间后台运行时,App 和 IM 服务端的连接会被手机操作系统断开。这样当有新的消息产生时,就没法通过 IM 服务再触达用户,因而会影响用户体验。

为了让用户在 App 未打开时,或者在后台运行时,也能接收到新消息,我们会将消息给到第三方外部接口服务,来通过手机操作系统自身的公共连接服务来进行操作系统级的“消息推送”,通过这种方式下发的消息一般会在手机的“通知栏”对用户进行提醒和展示。

另外很多 IM 系统一般也会加入红包功能,相应的会对接支付渠道和接口。

二:IM 系统都有哪些特性?

从业务需求出发,IM 系统都有哪些不一样的特性。

实时性,保证消息实时触达是互动场景的必备能力。

可靠性,“不丢消息”和“消息不重复”是系统值得信赖的前置条件。

一致性,“多用户”“多终端”的一致性体验能大幅提升 IM 系统的使用体验。

安全性,“数据传输安全”“数据存储安全”“消息内容安全”三大保障方面提供全面隐私保护。

  1. 实时性

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

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

了解到“实时性”在实时消息场景下的重要性后,在技术方面,我们会采用哪些手段来提升和保证这一特性呢?细节暂不展开,在第 3 部分的“轮询与长连接:如何解决消息实时到达问题”中,展开探讨“保证消息实时性”的几种方案。

  1. 可靠性

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

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

  • 不丢消息。“丢消息”是互动中让人难以接受的 Bug,某些场景下可能导致业务可用性差,甚至不可用的情况。比如直播间“全员禁言”的信令消息丢失,就可能导致直播室不可控的一些情况。

  • 消息不重复。消息重复不仅会对用户造成不必要的骚扰和困惑,可能还会导致比较严重的业务异常,比如直播间“送礼物”的消息由于某种原因被重复发出,处理不妥的话可能会导致用户损失。

那么如何做到“不丢消息”的同时,还能解决“消息重复”问题呢?对于 IM 系统可靠性的解决方案,我会在接下来的第 3 部分中的 “ACK 机制:如何保证消息的可靠投递”展开描述。

  1. 一致性

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

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

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

保证“消息的一致性”,也是考验即时消息系统的重要指标,那么具体在实战中都有哪些通用的技术能实现这个特性,一般使用 “消息序号生成器”来保证保证消息不会乱序。

  1. 安全性

由于即时消息被广泛应用于各种私密社交和小范围圈子社交,因此用户对于系统的隐私保护能力要求也相对较高。从系统使用安全性的角度来看,首先是要求“数据传输安全”,其次是要求“数据存储安全”,最后就是“消息内容安全”。

每一个方面实际上业界也都有比较成熟的应对方案,具体如何从这几方面入手来保障系统的整体安全性,在第 3 部分的:“HttpDNS 和 TLS:你的消息聊天内容真的安全吗”中会展开细述。

除了以上四大特性,作为一个相对高频使用的系统,消息系统在节能省电、省流量这些方面也增加了众多锦上添花的功能。

三 即时消息系统的关键技术

基础保障

消息实时性:轮询与长链接、服务端推送

在即时消息系统中,实现消息的实时传递至关重要。通常可以通过轮询和长轮询等技术,或者使用WebSocket实现双向通信来实现。

WebSocket允许有效的服务器推送,降低了服务器轮询的负担,同时减少了网络开销。WebSocket 的优点是:支持服务端推送的双向通信,大幅降低服务端轮询压力;数据交互的控制开销低,降低双方通信的网络开销;Web 原生支持,实现相对简单。

消息的可靠投递:ACK 机制

确保消息能够可靠地传递,不会丢失或重复,这对于用户的信任至关重要。ACK(确认)机制通过确认消息的接收来保证消息的可靠传递,确保消息送达和接收的一致性。

消息的一致性:消息序号生成器

消息一致性确保消息以正确的顺序显示,无论是在一对一聊天还是群聊中。消息序号生成器为每条消息分配唯一的序列号,以维护消息的顺序。

消息的安全性:HttpDNS 和 TLS

消息系统需要解决数据传输安全、数据存储安全和消息内容安全等问题。HttpDNS和TLS(传输层安全性)等技术在确保消息系统整体安全性方面发挥着关键作用。

解决网络不确定性:智能心跳

为了处理网络条件的不确定性,智能心跳机制有助于保持连接稳定,减少不必要的重连或断开。

性能提升

更快的媒体消息发送(分片上传)

为了提高发送包含图片、音频和视频等媒体内容的消息的速度,可以采用分片上传技术。这些技术允许系统将大文件分成小块发送,提高了效率。

更流畅的媒体播放和浏览(CDN加速)

内容分发网络(CDN)加速可优化媒体消息的传递,确保用户体验流畅的媒体内容播放和快速浏览。

服务模块水平扩展(Docker容器化

Docker容器化使得服务模块可以水平扩展,通过添加更多容器来处理增加的负载。

消息收发链路监控(端到端追踪)

通过端到端追踪监控整个消息传递过程,有助于识别和解决消息传递链路中的性能瓶颈和问题。

高可用性(流控和熔断)

实施速率限制和熔断机制可以确保高可用性,防止过载,并为系统提供容错性。

未来趋势

  • AI机器学习在用户体验改进中的作用

AI驱动的聊天机器人和预测输入技术将继续改进即时消息系统的用户体验。

  • 区块链在去中心化通信中的角色

区块链技术可能在创建注重安全和隐私的去中心化通信平台方面发挥作用。

  • 新兴技术及其潜在影响

关注新兴技术及其对即时消息系统的潜在影响对于保持竞争力并满足不断变化的用户期望至关重要。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聊一聊Java中的枚举和泛型(两种强大的编程特性)

聊一聊Java中的枚举和泛型(两种强大的编程特性) 保持热爱,奔赴山海。。。。。。 Java中的枚举 在Java中,枚举(Enum)是一种特殊的数据类型,用于定义包含固定常量集合的数据类型。枚举类型在Jav…

猫咪瘦弱的原因是什么?适合给消瘦猫咪长肉吃的猫罐头分享

很多小猫咪吃得很多,但是还是很瘦,这让很多猫主人感到困惑,猫咪瘦弱的原因是什么呢?铲屎那么多年,还是有点子养猫知识在身上的。那么,小猫咪瘦弱的原因是什么呢?让我们看看是不是这些原因导致的…

LinuxBasicsForHackers笔记 -- 进程管理

进程是一个正在运行和使用资源的程序。 Linux 内核是操作系统的内核,几乎控制着一切,在创建进程时,它会按顺序为每个进程分配一个唯一的进程 ID (PID)。 查看进程 ps – 用于在命令行查看哪些进程处于活动状态。单独使用 ps 命令并不能真正…

使用Notepad++编辑器,安装compare比较差异插件

概述 是一款非常有特色的编辑器,Notepad是开源软件,Notepad中文版可以免费使用。 操作步骤: 1、在工具栏 ->“插件”选项。 2、勾选Compare选项,点击右上角“安装”即可。 3、 确认安装插件 4、下载插件 5、插件已安装 6、打…

微前端介绍

目录 微前端概念 微前端特性 场景演示 微前端方案 iframe 方案 qiankun 方案 micro-app 方案 EMP 方案 无界微前端 方案 无界方案 成本低 速度快 原生隔离 功能强大 总结 前言:微前端已经是一个非常成熟的领域了,但开发者不管采用哪个现…

JAVA网络编程——BIO、NIO、AIO深度解析

I/O 一直是很多Java同学难以理解的一个知识点,这篇帖子将会从底层原理上带你理解I/O,让你看清I/O相关问题的本质。 1、I/O的概念 I/O 的全称是Input/Output。虽常谈及I/O,但想必你也一时不能给出一个完整的定义。搜索了谷哥欠,发…

MySQl int(1)、int(20) 的区别到底在哪里

MySQl int(1)、int(20) 的区别到底在哪里 常思一二,便得自然… int(1)数据类型介绍 在MySQL中,INT(1) 是一种定义整数类型的数据字段,其中的数字表示显示宽度而不是存储范围。具体说,INT(1) 中的数字 1 表示显示宽度&#xff0…

数字人知识库:Awesome-Talking-Head-Synthesis

数字人知识库:Awesome-Talking-Head-Synthesis 文章目录 数字人知识库:Awesome-Talking-Head-SynthesisDatasetsSurveyAudio-drivenText-drivenNeRF & 3DMetricsTools & SoftwareSlides & Presentations Gihub:https://github.co…

从 ByteHouse 网关,看如何进一步提升 OLAP 引擎性能

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 随着数字化转型的加速,企业面临着海量数据收集、处理和分析挑战。ClickHouse因其分析速度快、高性能的特点,被开发者广泛使用。 作为连接客户…

OPC UA客户端工具UaExpert使用

OPC UA客户端工具UaExpert使用 官方下载地址: https://www.unified-automation.com/downloads.html UaExpert 是一个全功能的 OPC UA 客户端,能够支持多个 OPC UA 配置文件和功能。 安装UaExpert 官方下载最新安装包: uaexpert-bin-win32-x86-vs2008sp1-v1.5.1-…

一文搞懂系列——你真的了解如何生成动态库了吗?

引言 动态库的编译,这有什么难度,这不是手到擒来的事情吗?无非不就是: gcc -FPIC -shared -o libxxx.so *.o *.c 我若是提出这些需求场景,阁下又如何应对呢? 动态库A依赖其他部分提供的能力。但是却不…

网络层(1)——概述

一、概述 网络层毫无疑问是最复杂的一层,涉及到大量的协议与结构的内容。在如今主流的设计中,大家都会把网络层分成两个部分:数据平面、控制平面。其中数据平面指的是网络层中每台路由器的功能,它决定了到达路由器端口输入链路之一…

马蹄集 oj赛(双周赛第十六次)

目录 ​圣诞树上的星星 军团大战 堆煤球 武力对决 小码哥教数学 小码哥玩字母独 跳跳棋 激光扫描游戏 数数游戏 小狗巴克 魔塔密码 地狱尖兵 3D眩晕 圣诞树上的星星 难度:青铜 时间限制: 1秒占用内存:64M 小码哥在过圣诞节! 小码哥家里有很多个星星 *&#xff0c…

热烈祝贺许战海老师成为北京湖南商会特聘专家!

在北京的初冬时节,一股商业的暖流在世纪华天大酒店的湖南厅中涌动。2023年12月3日下午,这里迎来了一场盛大的聚会——北京湖南企业商会成立20周年的预热活动之一:“湘商大讲堂”。这不仅是一次庆祝,更是一次对未来的展望&#xff…

在Pwn中,为什么时长需要栈对齐?

Index 介绍知识要点正文 介绍 在 Pwn 的学习中,对于初学者常常会遇到这个问题: 找到了溢出点,并且知道如何溢出,但是不知道为什么自己的Payload并没有成功,Pwntools报错EOF: 今天趁着有时间,来…

C++ 指针进阶

目录 一、字符指针 二、指针数组 三、数组指针 数组指针的定义 &数组名 与 数组名 数组指针的使用 四、数组参数 一维数组传参 二维数组传参 五、指针参数 一级指针传参 二级指针传参 六、函数指针 七、函数指针数组 八、指向函数指针数组的指针 九、回调函…

HBase 使用JDK21

HBase 使用JDK21 启动zookeeper和hadoop 创建软件目录 mkdir -p /opt/soft cd /opt/soft下载软件 wget https://dlcdn.apache.org/hbase/2.5.6/hbase-2.5.6-hadoop3-bin.tar.gz解压 hbase tar -zxvf hbase-2.5.6-hadoop3-bin.tar.gz修改 hbase 目录名称 mv hbase-2.5.6-had…

圣诞将至—C语言圣诞树代码来啦

文章目录 圣诞将至—C实现语言圣诞树源码 圣诞将至—C实现语言圣诞树 圣诞树 源码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <math.h> #include <stdlib.h> #include <windows.h> #include <time.h> #define PI 3.14159265…

深眸科技以机器视觉高性能优势,为消费电子行业提供优质解决方案

机器视觉技术近年来发展迅速&#xff0c;基于计算机对图像的处理与分析&#xff0c;能够识别和辨别目标物体&#xff0c;被广泛应用于人工智能、智能制造等领域。 机器视觉凭借着高精度、高效率、灵活性和可靠性等优势&#xff0c;不断推进工业企业生产自动化和智能化进程&…

论ChatGPT让程序员提升效率—掌握时代工具风口修炼之道【文末送书-02】

文章目录 一.论ChatGPT让程序员提升效率—掌握时代工具风口修炼之道二.ChatGPT在代码编写中的应用2.1 快速解决问题&#xff1a;2.2 优化代码结构&#xff1a;2.3 ChatGPT的学习过程2.4 ChatGPT的自定义训练 三.文末推荐与福利免费包邮送出4本&#xff01;3.2领书方式 一.论Cha…