分层架构 IM 系统之多媒体功能设计与实现

现在 IM 系统已经不仅限于文本消息的通讯了,多媒体数据占据越来越多的比重,比如:文件传输、语音通话、视频通话等。

在前面的文章(《基于需求分析模型来结构化剖析 IM 系统》)中我们分析过,“多媒体消息” 属于扩展功能需求,“点对点私信消息” 属于基础功能需求,扩展功能以基础功能为基础,基础功能稳定实现后,开发扩展功能是非常简单和快速的事情。今天我们分析一下 IM 系统的文件传输和语音通话功能关键逻辑实现,内容不复杂。

在前面关于分层架构 IM 系统所有文章的描述中,客户端与服务端之间的通讯一直是基于一条 TCP 连接进行的,也就是单通道通讯。其实,在一个具备多种功能的 IM 产品中,前后端的通讯往往都是基于多通道的,也就是每个客户端与服务端之间会建立多条连接(可能是 TCP 协议、也肯能是 HTTP 协议,还可能是 WebSocket 协议),为什么要这样设计呢?

首先,每个通道传输自己专属的数据,避免通道之间相互影响,产生阻塞或延迟,尤其是文本消息数据,需要一个专属的通讯通道;我们知道多媒体数据往往会占用较大空间,如果通过文本消息通道传输多媒体数据的话,很容易影响文本消息的及时性和可靠性。

其次,每个通道传输自己专属的数据,这从底层逻辑上就解耦了逻辑关联,降低了整个系统实现的复杂性;我们在前面的文章(《架构师晋级:直播问答系统(解析)》)中,分析过直播问答系统如何通过多通道设计系统架构,降低复杂度。

下面,我们分别分析一下如何基于 IM 系统实现文件传输和语音通话。

一、文件传输

IM 系统的文件传输逻辑流程,见下图。

基于 IM 系统传输文件,我们需要扩展消息的类型;最常见的消息类型是文本消息,可以扩展出文件消息类型、表情消息类型、语音消息类型、视频消息类型等,只是在聊天窗口中需要以不同的方式进行展示。以客户端 uid=101 给客户端 uid=102 传输文件为例,文件传输的基本逻辑流程如下:

  1. 客户端 uid=101 访问 APPServer,获取访问令牌; APPServer 是需要搭建的内部服务,专门用来管理访问令牌;令牌是客户端用来访问文件服务器(这里以对象存储服务 OSS 为例)的凭证;APPServer 只给合法的客户端发放令牌,毕竟 OSS 是收费的,只能供自己的客户端产品使用。

  2. 客户端 uid=101 凭访问令牌,将文件上传到 OSS,并记录下文件的唯一标识,文件在 OSS 中的存储位置(桶和目录)。

  3. 客户端 uid=101 将文件在 OSS 中存储的相关信息(桶名称、存储目录、文件标识等)封装成 IM 消息,发送到 IM 服务端;这是 IM 消息发送的基本流程,在前面的文章(《分层架构 IM 系统之消息收发功能设计与实现》)中详细分析过。

  4. 若客户端 uid=102 处于在线状态,IM 服务端会将文件消息直接推送到客户端,这个过程通过 “三重保障” 实现消息的可靠性(《分层架构 IM 系统之消息收发功能设计与实现》);若客户端 uid=102 处于离线状态,待登录后,会拉取相关离线消息。

  5. 客户端 uid=102 通过解析,发现是文件消息类型后,请求 APPServer ,获取访问 OSS 的令牌。

  6. 客户端 uid=102 凭访问令牌,根据解析出的文件相关信息(桶名称、存储目录、文件标识等)访问 OSS,将客户端 uid=101上传的文件,下载到本地。

这就是基于 IM 系统进行文件传输的基本流程,第 3 和第 4 步,是消息收发的基本逻辑,以此为基础引入文件存储(OSS),集成和实现对文件存储的安全访问。

二、语音通话

IM 系统的语音通话逻辑流程,见下图。

基于 IM 系统进行语音通话逻辑流程实现,与文件传输类型,都是以 IM 系统传输消息为基础,集成语音通话服务(这里以 WChat 为例进行说明);客户端 uid=101 给客户端 uid=102 打语音电话,其基本的逻辑流程如下:

  1. 客户端 uid=101 访问 WChat,申请一个语音通话的房间,获取房间标识和访问令牌 voiceToken;房间是语音服务的一个逻辑概念,只有进入同一个房间的客户端才能建立语音连接实现语音通话;WChat 建立 “房间” 后,该 “房间” 具有一定的时效性(比如:30秒),若对方没有及时进入到 “房间”,“房间” 会失效;想一下,我们使用微信时通过语音呼叫对方的场景,很容易理解。

  2. 客户端 uid=101 将房间标识信息封装成 IM 消息,发送到 IM服务端;这是 IM 消息收发的基本逻辑。

  3. 若客户端 uid=102 在线,IM 服务端直接将语音消息推送到客户端;若客户端 uid=102 离线,IM 系统需要通过其他方式(手机push、微信消息、短信等)及时通知到用户。

  4. 客户端 uid=102 通过解析,发现是语音消息类型后,向 IM 服务端发出获取 voiceToken 的请求,IM 服务端会通过访问 WChat 获取语音会话令牌;为什么客户端 uid=102 不直接访问 WChat 获取 voiceToken 呢? 一是为了安全性,只有申请房间的客户端可以直接访问 WChat,而要加入房间的客户端,则需要访问 IM 服务端,IM 过滤掉了加入房间的非法用户;二是 WChat 中的房间具有时效性,要加入房间的客户端在访问 IM 时, IM 会对房间的时效性进行判断,IM 过滤掉了没有及时加入房间的用户。

  5. 客户端 uid=102 根据获取的 voiceToken 和房间标识,访问 WChat,加入房间,与客户端 uid=101 建立语音会话。

不管是文件传输,还是语音通话,都是以 IM 消息通道为基础,然后集成相关服务进行扩展。

最后,总结文中关键:

  1. “点对点私信” 是基础功能需求,“多媒体” 是扩展功能需求,基础功能稳定实现后,开发扩展功能是非常简单和快速的事情;

  2. 具备多种功能的 IM 产品中,前后端的通讯往往是基于多通道的,这样设计的原因一是为了避免通道之间的相互影响,导致数据阻塞和延迟,二是为了降低实现的复杂度;

  3. 基于 IM 的文件传输逻辑,以 IM 消息通道为基础,然后引入文件存储服务,实现对文件存储的安全访问;

  4. 基于 IM 的语言通话逻辑,以 IM 消息通道为基础,然后引入语音通话服务,实现对语音通话的安全访问。

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

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

相关文章

0.gitlab ubuntu20.04 部署问题解决

安装依赖: ① sudo apt-get update 出现: 解决方式: 去 /etc/apt/sources.list.d 这个目录删除或注释对应的list文件 第三方软件的源一般都以list文件的方式放在 /etc/apt/sources.list.d 这个目录 重新运行sudo apt-get update 安装…

Next.js v15 - 服务器操作以及调用原理

约定 服务器操作是在服务器上执行的异步函数。它们可以在服务器组件和客户端组件中调用,用于处理 Next.js 应用程序中的表单提交和数据修改。 服务器操作可以通过 React 的 “use server” 指令定义。你可以将该指令放在 async 函数的顶部以将该函数标记为服务器操…

什么是3DEXPERIENCE SOLIDWORKS,它有哪些角色和功能?

将业界领先的 SOLIDWORKS 3D CAD 解决方案连接到基于单一云端产品开发环境 3DEXPERIENCE 平台。您的团队、数据和流程全部连接到一个平台进行高效的协作工作,从而能快速的做出更好的决策。 目 录: ★ 1 什么是3DEXPERIENCE SOLIDWORKS ★ 2 3DEXPERIE…

【华为OD-E卷-开心消消乐 100分(python、java、c++、js、c)】

【华为OD-E卷-开心消消乐 100分(python、java、c、js、c)】 题目 给定一个 N 行 M 列的二维矩阵,矩阵中每个位置的数字取值为 0 或 1。矩阵示例如: 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 现需要将矩阵中所有的 1 进行反转为 0&#…

[Unity]【图形渲染】【游戏开发】Shader数学基础4-更多矢量运算

在计算机图形学和着色器编程中,矢量运算是核心的数学工具之一。矢量用于描述空间中的位置、方向、速度等各种物理量,并在图形变换、光照计算、纹理映射等方面起着至关重要的作用。本篇文章将详细讲解矢量和标量之间的乘法与除法、矢量的加法与减法、矢量的模与单位矢量、点积…

【漏洞复现】CVE-2023-37461 Arbitrary File Writing

漏洞信息 NVD - cve-2023-37461 Metersphere is an opensource testing framework. Files uploaded to Metersphere may define a belongType value with a relative path like ../../../../ which may cause metersphere to attempt to overwrite an existing file in the d…

Bcrypt在线密码加密生成器

具体前往:在线Bcrypt加密工具--使用bcrypt及生成salt的迭代次数强度参数计算生成哈希(摘要)

Django 模板分割及多语言支持案例【需求文档】-->【实现方案】

Django 模板分割及多语言支持案例 这个案例旨在提供一个清晰的示范,展示如何将复杂的页面分解为多个可复用的模板组件,使代码更加模块化和易于管理。希望这篇案例文章对你有所帮助。 概述 在 Django 项目开发中,使用模板分割和多语言支持能…

wxWidgets使用wxStyledTextCtrl(Scintilla编辑器)的正确姿势

开发CuteMySQL/CuteSqlite开源客户端的时候,需要使用Scintilla编辑器,来高亮显示SQL语句,作为C/C领域最成熟稳定又小巧的开源编辑器,Scintilla提供了强大的功能,wxWidgets对Scintilla进行包装后的是控件类:…

构建高性能异步任务引擎:FastAPI + Celery + Redis

在现代应用开发中,异步任务处理是一个常见的需求。无论是数据处理、图像生成,还是复杂的计算任务,异步执行都能显著提升系统的响应速度和吞吐量。今天,我们将通过一个实际项目,探索如何使用 FastAPI、Celery 和 Redis …

介绍 Html 和 Html 5 的关系与区别

HTML(HyperText Markup Language)是构建网页的标准标记语言,而 HTML5 是 HTML 的最新版本,包含了一些新的功能、元素、API 和属性。HTML5 相对于早期版本的 HTML(比如 HTML4)有许多重要的改进和变化。以下是…

【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源码)

一、RAGFlow简介 RAGFlow是一个基于对文档深入理解的开源RAG(Retrieval-augmented Generation,检索增强生成)引擎。 主要作用: 让用户创建自有知识库,根据设定的参数对知识库中的文件进行切块处理,用户向大…

qwt 之 QwtPlotPicker

QwtPlotMarker 和 QwtPlotPicker 是 Qwt 库中用于增强 QwtPlot 功能的两个重要类。它们分别用于在图中添加标记和实现交互式的选择或拖动功能。 QwtPlotPicker 提供了交互式的选择工具,它允许用户通过鼠标点击或拖动来选择图表中的数据点或区域。这对于实现缩放、平…

C/C++圣诞树

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C…

lua dofile 传参数

cat 1.lua arg[1] 111 arg[2] 222 dofile(./2.lua) cat 2.lua print("First argument is: " .. arg[1]) print("Second argument is: " .. arg[2]) 执行 lua 1.lua,结果为: First argument is: 111 Second argument is: 222 l…

电商数据流通的未来:API接口的智能化与自动化趋势

在数字化时代,电子商务行业正在以前所未有的速度发展,而API(应用程序编程接口)接口作为电商领域的重要组成部分,其应用和发展趋势也日益受到关注。API接口作为电商系统与外部服务或平台交互的桥梁,对电商数…

投标心态:如何在“标海战术”中保持清醒的头脑?

在竞争激烈的市场环境下,“标海战术”——即大规模参与投标——已经成为许多企业争取市场份额的重要策略。然而,盲目追求投标数量可能导致资源浪费、团队疲劳以及战略目标的模糊化。在这种高强度的竞争模式中,如何保持清醒的头脑,…

【苍穹外卖】学习心得体会-随笔

前言 写了很久,终于可以完整运行项目了,记录下这几天的心得体会回顾一下知识点 第一天、Git 分布式版本控制工具 一、Git概述 定义:是分布式版本控制工具,用于管理软件开发中的源代码文件,像Java类、xml文件、html…

windows C#-使用构造函数

实例化类或结构时,将会调用其构造函数。 构造函数与该类或结构具有相同名称,并且通常初始化新对象的数据成员。 在下面的示例中,通过使用简单构造函数定义了一个名为 Taxi 的类。 然后使用 new 运算符对该类进行实例化。 在为新对象分配内存…

研发效能DevOps: Vite 使用 Element Plus

目录 一、实验 1.环境 2.初始化前端项目 3.安装 vue-route 4.安装 pinia 5.安装 axios 6.安装 Element Plus 7.gitee创建工程 8. 配置路由映射 9.Vite 使用 Element Plus 二、问题 1.README.md 文档推送到gitee未自动换行 2.访问login页面显示空白 3.表单输入账户…