「子彈短信」炸翻了創投圈,上線短短7天,掀起IM行業一股巨浪。網易雲信做爲子彈短信IM以及音視頻通話技術提供者,今天來聊聊子彈短信這款即時通信產品裏面一個重要功能—消息漫遊。
【知識點】消息漫遊是指即時通信產品將用戶聊天記錄保存在雲端,用戶在任何一個終端設備上都能獲取到所有的聊天記錄。
算法
消息漫遊在即時通信領域是相對高級的功能,不少社交軟件沒有提供該功能,下面咱們來分析下子彈短信消息漫遊的技術實現。sql
發送者 A經過鏈接層x將消息發往業務邏輯層,業務邏輯層APP(保存着A和B的在線狀態)經過鏈接層y將消息轉給接收者B,完成了一次消息發送過程。數據庫
發送者A有多個終端在線時,在A用手機將消息發送給B的同時會給A的電腦終端發送一條通知,從而完成消息的多端同步緩存
多端消息交互過程若是用戶一個終端不在線,那麼不在線的一端是沒法同步到聊天記錄的,此時就須要用到消息漫遊功能,當發送者A將消息發給B時,APP會把消息存儲起來,Cache中保存着用戶近期的聊天記錄,DB採用時間序列數據庫,保存着用戶的歷史聊天記錄,客戶端保存着消息同步的時間戳,登陸時根據時間戳,經過緩存加歷史的方式拉取數據,從而實現完整會話消息的漫遊安全
即時通信中產生了海量的消息,若是使用了消息漫遊的功能,消息的存儲就是一個不小的挑戰。首先用戶在會話中產生的消息是有個TimeLine的,在存儲上也須要按照時間來存儲。圖中給出了兩種存儲方式,1中的寫入方式是按照會話來存的,這樣存消息的好處是,多我的的消息只存一份,即按照會話來存儲,可是這種方式帶來了一個問題,就是A要拉取消息記錄時須要去A的每一個會話中分別讀取,產生了讀擴散;2中的寫入方式是按照用戶來存的,這樣存消息的好處是讀取方便,可是一個會話的消息被存了屢次,產生了寫擴散。
上面介紹的兩種存儲方式各有優缺點,究竟哪種存儲方式更好呢?網絡
首先來看下即時通信的應用場景,對於消息記錄寫入很是頻繁,而讀取動做通常發生在登錄時的狀況較少;再來看下DB選型:使用寫擴散方式時一條消息會寫入兩條記錄,讀取時一次可查詢出全部記錄;使用讀擴散方式時一條消息寫入一條記錄,讀取時須要根據會話數量讀取屢次;傳統的關係型數據庫應對讀擴散會很是吃力,只能使用寫擴散的方式實現,若是使用nosql數據庫存儲則兩種方式均可以實現。異步
子彈短信使用了內存數據庫+時間序列數據庫的存儲方式。內存數據庫採用讀擴散的方式存儲近期消息,時間序列數據庫則採用寫擴散的方式存儲歷史消息。這樣的存儲方式有如下幾個考量:nosql
內存數據庫的高TPS和低RT對用戶正常的消息收發影響很小,採用異步寫入讓吞吐量進一步提高性能
內存數據使用讀擴散的存儲方式,首先內存的成本相對較高,需儘量的減小空間佔用,再則內存數據庫的低RT能夠應對讀擴散帶來的延時問題編碼
歷史消息量較大,採用存儲介質較爲廉價的數據庫存儲,同時爲了保證查詢性能,存儲方式使用了寫擴散的形式,選用支持時間序列的數據庫,對比關係型數據庫有更好的讀寫表現
歷史消息使用異步寫入,對業務流程無影響
客戶端保存上次同步的時間戳,除了用戶卸載應用或者長時間不登陸的狀況下,讀請求都會落在內存數據庫上,用戶體驗比較好
做爲即便通信Paas平臺,須要對業務方提供消息內容審覈機制,也要對監管方提供消息數據。中心化的集中存儲實現消息內容審覈較容易,也能及時響應監管方的消息覈查需求。
保證消息不丟失,IM系統中心化有助於實現多端漫遊功能,用於解決用戶在多個設備,多個場景下切換帳號時消息同步的問題,提高了用戶體驗。
在數據訪問的制度管理上:平臺方通常會使用私有云方案,數據中心均不提供外網訪問,租戶網絡下訪問也加入了權限限制
在數據存儲的安全方面:使用了私有協議的數據編碼和加密機制存取消息,即便發生了拖庫也沒法解出消息內容
在數據傳輸協議方面:網絡通訊使用了自定義編解碼報文和加密算法,API接口等支持SSL加密,輔之以業務層鑑權機制,有效保證了信息的傳輸安全。
以上就是對於子彈短信消息漫遊技術淺析。