摘要:如果你需要一款穩定可靠的高性能企業級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如何解決這些痛點?
- 開源Redsi資料庫可靠性差,甚至丟資料,會直接導致IM系統癱瘓,
GaussDB(for Redis)對資料進行分片,在故障場景下可以自動進行接管,最多可以滿足N-1個計算節點故障;存盤層使用華為自研的企業級存盤池DFV Pool,基于分布式、強一致、高性能的先進架構,實作3AZ6副本存盤,保證了在任何時間點的資料強一致,故障情況下資料不丟失, - 大流量、高并發場景如何支持連接管理,按業務況分散壓力?
GaussDB(for Redis)可以滿足IM系統對可用性的要求,客戶端程式通過ELB接入GaussDB(for Redis)實體,可實作自動負載均衡, - 突發的高流量、大量的歷史訊息資料如何處理?
GaussDB(for Redis)采用先進的存算分離架構,在IM系統持續運營的程序中,如果出現突發流量,可以迅速對計算層資源進行秒級擴縮容,快速扛住流量尖峰;歷史訊息持續增長時,也可以單獨對存盤層資源大小進行秒級動態調整,最高可擴容至PB級,
GaussDB(for Redis)廣泛適用于社交媒體、游戲、電商、推薦系統等領域,在海量并發場景具備極強的高可用能力,如果你需要一款穩定可靠的高性能企業級KV資料庫,不妨試試GaussDB(for Redis),
點擊關注,第一時間了解華為云新鮮技術~
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/550827.html
標籤:其他
上一篇:C#寫一套最全的SQL server幫助類(包括增刪改查)
下一篇:返回列表
