即時通訊系統為什麼選擇GaussDB(for Redis)?

来源:https://www.cnblogs.com/huaweiyun/archive/2023/04/21/17340948.html
-Advertisement-
Play Games

摘要:如果你需要一款穩定可靠的高性能企業級KV資料庫,不妨試試GaussDB(for Redis)。 每當網路上爆出熱點新聞,混跡於各個社交媒體的小伙伴們全都開啟了討論模式。一條消息的產生是如何在群聊中傳遞的呢?讓我們一起來探索即時通訊系統(IM)的原理。 IM系統架構的原理 當你在群聊“相親相愛一 ...


摘要:如果你需要一款穩定可靠的高性能企業級KV資料庫,不妨試試GaussDB(for Redis)。

每當網路上爆出熱點新聞,混跡於各個社交媒體的小伙伴們全都開啟了討論模式。一條消息的產生是如何在群聊中傳遞的呢?讓我們一起來探索即時通訊系統(IM)的原理。

IM系統架構的原理

當你在群聊“相親相愛一家人”中,發送了一條“我找到女朋友了,今天帶回家吃飯”,你自然是希望全家人都收到你的喜訊,為你女朋友的到來分頭準備。那麼正常的流程應該是這樣:遍歷群成員、查詢每個成員的線上狀態、如果小伙伴們線上則實時進行推送,如果小伙伴們不線上則暫存至離線庫待上線後主動拉取。

這種模式就是傳統的IM架構,由於發送成功的消息不會落入離線庫,因此聊天記錄多端漫游無法實現。如果線上用戶推送發生異常,會導致個別人員丟失關鍵發言,錯失重要信息。為了保證消息存儲的可靠性,我們對IM系統架構進行了優化,不管成員是否線上都要先把消息和發送對象存儲起來,再進行推送。流程變成:遍歷群成員、為群聊的每一個人對應的消息隊列都存一份消息、查詢每個成員的線上狀態、對線上成員進行推送。這就是所謂的寫擴散模型

這裡顯然還存在一個問題,我們向每個小伙伴的消息隊列中都存儲了相同的“我找到女朋友了,今天帶回家吃飯”消息,對磁碟和帶寬造成了很大的浪費,這是寫擴散的最大弊端。所以我們繼續優化,群消息實體存儲一份,用戶只存消息 ID 索引。流程優化為:遍歷群聊的成員、先存一份消息實體、群聊所有人都存一份ID 引用、查詢每個成員的線上狀態、對線上成員進行推送。這就是所謂的讀擴散模型

簡單總結下:

1.讀擴散:讀取操作很重,寫入操作很輕,資源消耗相對小一些。

2.寫擴散:讀取操作很輕,寫入操作很重,資源消耗相對大一些。

IM系統架構優化實踐

接下來,讓我們使用GaussDB(for Redis) 來實現一個簡單的IM應用。

  • 使用GaussDB(for Redis)的List類型實現一個消息隊列,防止發送端瞬時高流量會壓爆消息處理模塊;
  • 收到消息後,先生成一個全局唯一ID標識該信息,將消息ID和消息內容存入String類型的消息存儲庫中,如果消息欄位複雜也可以考慮使用Hash類型;
  • 對於消息中可索引的信息,將消息的索引信息存入Zset類型的消息索引庫中,這樣無論是接收者還是發送者,都可以按照一定規則對歷史消息進行檢索;
  • 通過查詢Set類型的消息關係群組庫,查詢該信息的接收者集合,這個集合可以根據一定的規則動態增刪;
  • 將消息ID推入Stream類型的消息同步庫,每個Stream對象對應一個接收者,接收者可以通過XRANG命令獲取一個範圍內的未讀信息ID;
  • 最後,接收者再通過這組ID,從消息存儲庫中讀取消息原始內容,即完成了一次消息傳遞。

Why GaussDB (for Redis)?

IM系統有哪些痛點?高斯Redis如何解決這些痛點?

  1. 開源Redsi資料庫可靠性差,甚至丟數據,會直接導致IM系統癱瘓。
    GaussDB(for Redis)對數據進行分片,在故障場景下可以自動進行接管,最多可以滿足N-1個計算節點故障;存儲層使用華為自研的企業級存儲池DFV Pool,基於分散式、強一致、高性能的先進架構,實現3AZ6副本存儲,保證了在任何時間點的數據強一致,故障情況下數據不丟失。
  2. 大流量、高併發場景如何支持連接管理,按業務況分散壓力?
    GaussDB(for Redis)可以滿足IM系統對可用性的要求,客戶端程式通過ELB接入GaussDB(for Redis)實例,可實現自動負載均衡。
  3. 突發的高流量、大量的歷史消息數據如何處理?

GaussDB(for Redis)採用先進的存算分離架構,在IM系統持續運營的過程中,如果出現突發流量,可以迅速對計算層資源進行秒級擴縮容,快速扛住流量尖峰;歷史消息持續增長時,也可以單獨對存儲層資源大小進行秒級動態調整,最高可擴容至PB級。

GaussDB(for Redis)廣泛適用於社交媒體、游戲、電商、推薦系統等領域,在海量併發場景具備極強的高可用能力。如果你需要一款穩定可靠的高性能企業級KV資料庫,不妨試試GaussDB(for Redis)。

 

點擊關註,第一時間瞭解華為雲新鮮技術~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C#中的IDGen是一個C#實現的Twitter Snowflake演算法的ID生成器,可以生成全局唯一的ID,支持高併發場景下的ID生成。在本篇文章中,我們將介紹IDGen的使用方法並提供相關的C#示例代碼。 IDGen的介紹 IDGen是一款開源的分散式唯一ID生成器,支持多種ID生成演算法,並且可 ...
  • 用過ASP.NET Core MVC中IActionFilter攔截器的開發人員,都知道這是一個非常強大的MVC攔截器。最近才發現IActionFilter的OnActionExecuting方法,甚至可以獲取Controller的Action方法參數值。 假如我們在ASP.NET Core MVC ...
  • 平臺 windows 需 求 由於我近期有一個比賽,而我的主機又是x86架構的,人家要求使用arm架構的主機,我這窮屌絲,不可 能去買一臺吧,而且隨著國產系統的推進,採用arm架構的主機也越來越多,作為運維我們該怎麼利用x86 來運行arm架構的主機成為了一個問題 需 要的軟體和程式 以下軟體版本皆 ...
  • ansible分離部署LNMP 環境說明: | 系統 | 主機名 | IP | 服務 | | | | | | | centos8 | ansible | 192.168.111.141 | ansible主控機 | | centos8 | nginx | 192.168.111.142 | ngin ...
  • ​根據2022年的DevOps全球調查報告顯示,主流軟體企業採用或部分採用DevOps且已獲得良好成效的占比已達70%,DevOps儼然成為當下軟體開發研究的重要方向。 測試作為軟體開發的必要過程,是提升軟體可靠性、保證軟體質量的關鍵環節。然而,從過往研究文獻來看,希望通過DevOps提升軟體交付效 ...
  • 在這裡分享項目中我經常使用的一種串口收發方式:阻塞發送 + 接收中斷 +空閑中斷 + 環形隊列 項目代碼地址:https://gitee.com/Mokun_gitee/stm32_hal_study.git 一、簡介 串口發送使用最簡單的阻塞發送方式,一般來說都是接收的數據量比較大,發送數據用此方 ...
  • 我學習的過程中,對於連接池和數據源分得不是很清楚,而且我發現有的人將資料庫等同於數據源,或者將數據源等同於連接池,實際上這些說法並不准確。 ...
  • 功能02-商鋪查詢緩存03 3.功能02-商鋪查詢緩存 3.6封裝redis工具類 3.6.1需求說明 基於StringRedisTemplate封裝一個工具列,滿足下列需求: 方法1:將任意Java對象序列化為json,並存儲在string類型的key中,並且可以設置TTL過期時間 方法2:將任意 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...