網易來聊聊子彈簡訊的訊息漫遊技術

網易雲信發表於2018-09-03

“子彈簡訊”炸翻了創投圈,上線短短7天,掀起IM行業一股巨浪。網易雲信作為子彈簡訊IM以及音視訊通話技術提供者,今天來聊聊子彈簡訊這款即時通訊產品裡面一個重要功能—訊息漫遊。
知識點訊息漫遊是指即時通訊產品將使用者聊天記錄儲存在雲端,使用者在任何一個終端裝置上都能獲取到全部的聊天記錄。

聊聊子彈簡訊怎麼實現訊息漫遊

訊息漫遊在即時通訊領域是相對高階的功能,很多社交軟體沒有提供該功能,下面我們來分析下子彈簡訊訊息漫遊的技術實現。

1. 子彈簡訊即時通訊的訊息互動

網易來聊聊子彈簡訊的訊息漫遊技術

傳送者 A通過連線層x將訊息發往業務邏輯層,業務邏輯層APP(儲存著A和B的線上狀態)通過連線層y將訊息轉給接收者B,完成了一次訊息傳送過程。

2. 子彈簡訊多端線上的訊息互動

網易來聊聊子彈簡訊的訊息漫遊技術

傳送者A有多個終端線上時,在A用手機將訊息傳送給B的同時會給A的電腦終端傳送一條通知,從而完成訊息的多端同步

3. 子彈簡訊訊息漫遊的實現

網易來聊聊子彈簡訊的訊息漫遊技術

多端訊息互動過程如果使用者一個終端不線上,那麼不線上的一端是無法同步到聊天記錄的,此時就需要用到訊息漫遊功能,當傳送者A將訊息發給B時,APP會把訊息儲存起來,Cache中儲存著使用者近期的聊天記錄,DB採用時間序列資料庫,儲存著使用者的歷史聊天記錄,客戶端儲存著訊息同步的時間戳,登入時根據時間戳,通過快取加歷史的方式拉取資料,從而實現完整會話訊息的漫遊

漫遊訊息的儲存方式

網易來聊聊子彈簡訊的訊息漫遊技術

即時通訊中產生了海量的訊息,如果使用了訊息漫遊的功能,訊息的儲存就是一個不小的挑戰。首先使用者在會話中產生的訊息是有個TimeLine的,在儲存上也需要按照時間來儲存。圖中給出了兩種儲存方式,1中的寫入方式是按照會話來存的,這樣存訊息的好處是,多個人的訊息只存一份,即按照會話來儲存,但是這種方式帶來了一個問題,就是A要拉取訊息記錄時需要去A的每個會話中分別讀取,產生了讀擴散;2中的寫入方式是按照使用者來存的,這樣存訊息的好處是讀取方便,但是一個會話的訊息被存了多次,產生了寫擴散。
上面介紹的兩種儲存方式各有優缺點,究竟哪一種儲存方式更好呢?

首先來看下即時通訊的應用場景,對於訊息記錄寫入非常頻繁,而讀取動作一般發生在登陸時的情況較少;再來看下DB選型:使用寫擴散方式時一條訊息會寫入兩條記錄,讀取時一次可查詢出所有記錄;使用讀擴散方式時一條訊息寫入一條記錄,讀取時需要根據會話數量讀取多次;傳統的關係型資料庫應對讀擴散會非常吃力,只能使用寫擴散的方式實現,如果使用nosql資料庫儲存則兩種方式都可以實現。

子彈簡訊使用的混合儲存方式

子彈簡訊使用了記憶體資料庫+時間序列資料庫的儲存方式。記憶體資料庫採用讀擴散的方式儲存近期訊息,時間序列資料庫則採用寫擴散的方式儲存歷史訊息。這樣的儲存方式有以下幾個考量:

  • 記憶體資料庫的高TPS和低RT對使用者正常的訊息收發影響很小,採用非同步寫入讓吞吐量進一步提升

  • 記憶體資料使用讀擴散的儲存方式,首先記憶體的成本相對較高,需儘可能的減少空間佔用,再則記憶體資料庫的低RT可以應對讀擴散帶來的延時問題

  • 歷史訊息量較大,採用儲存介質較為廉價的資料庫儲存,同時為了保證查詢效能,儲存方式使用了寫擴散的形式,選用支援時間序列的資料庫,對比關係型資料庫有更好的讀寫表現

  • 歷史訊息使用非同步寫入,對業務流程無影響

  • 客戶端儲存上次同步的時間戳,除了使用者解除安裝應用或者長時間不登入的情況下,讀請求都會落在記憶體資料庫上,使用者體驗比較好

即時通訊平臺的訊息漫遊設計理念

1. 中心化儲存

作為即使通訊Paas平臺,需要對業務方提供訊息內容稽核機制,也要對監管方提供訊息資料。中心化的集中儲存實現訊息內容稽核較容易,也能及時響應監管方的訊息核查需求。
保證訊息不丟失,IM系統中心化有助於實現多端漫遊功能,用於解決使用者在多個裝置,多個場景下切換賬號時訊息同步的問題,提升了使用者體驗。

2. 資訊保安

在資料訪問的制度管理上:平臺方一般會使用私有云方案,資料中心均不提供外網訪問,租戶網路下訪問也加入了許可權限制
在資料儲存的安全方面:使用了私有協議的資料編碼和加密機制存取訊息,即使發生了拖庫也無法解出訊息內容
在資料傳輸協議方面:網路通訊使用了自定義編解碼報文和加密演算法,API介面等支援SSL加密,輔之以業務層鑑權機制,有效保證了資訊的傳輸安全。

以上就是對於子彈簡訊訊息漫遊技術淺析。


相關文章