分層架構 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.pswp.cn/web/63692.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63692.shtml
英文地址,請注明出處:http://en.pswp.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.表單輸入賬戶…