多終端漫遊是指:用戶在任意一個設備登陸後,都能獲取到歷史的聊天記錄。如:QQ 默認漫遊 7 天的聊天記錄,開通 VIP 會員可漫遊 30 天,開通 SVIP 會員可漫遊 2 年。服務器
支持消息多終端漫遊通常須要兩個條件:網絡
記錄設備的在線狀態,當用戶在多個終端同時登陸併發送消息時,IM 服務端將收到的消息推給接收方的多臺在線設備,同時推給發送方的其餘登陸設備。
能夠看到,當多終端同時在線,只須要維護設備的在線狀態就能夠了。併發
上面的圖是假設接收方或發送方的多臺終端設備都是在線狀態,若發送方或接收方用戶的多臺終端設備中,某些設備是離線狀態,此時發送消息,IM 服務端只會將消息推送給在線設備,同時將消息存儲到服務器,以便離線設備上線後同步歷史消息。
學習
用戶的某臺離線設備上線後,須要知道獲取哪些離線消息,通常採用版本號實現多終端和服務端的數據同步,保證離線消息能夠作到按需拉取。
同步流程如圖所示:
① 當有消息須要推送給用戶時,會爲每條消息生成一個版本號,並連同消息存入離線存儲中,同時更新服務端維護的接收方用戶的最新版本號,並將只攜帶版本號的消息發送給發送方設備,使發送方設備的最新版本號和服務端同步。
② 接收方的在線設備接收到消息後,更新本地的最新版本號爲收到的最後一條消息的版本號。
③ 當接收方的離線設備上線時,會提交本地最新版本號到服務端,服務端比對服務端維護的該用戶的最新版本號和客戶端提交上來的版本號,如不一致,服務端會根據客戶端的版本號從離線存儲獲取「比客戶端版本號新」的消息,並推送給新上線的客戶端。code
離線消息的存儲,不只包括消息內容自己,還須要存儲一些操做(刪除、撤銷等)的信令。好比:用戶 A 在一臺已上線的設備刪除/撤銷了某條發送給用戶 B 的消息,這個操做的信令也會和消息一塊兒存儲起來,這樣當用戶 A 的另外一臺離線設備上線時,就不會同步這個已刪除/撤銷的消息。blog
因此存儲離線消息時,會存儲消息內容、操做信令、消息對應的版本號。同步
離線消息的存儲成本比較高,由於不知道用戶有幾個設備,也不知道用戶的離線設備多久上線,因此離線消息的存儲通常會有時限和條數的限制,好比保留 1 周時間,最多存儲 1000 條,若在保留時間內消息超過規定條數,在不超過大小限制和時效限制的前提下,採用 FIFO(先進先出) 的淘汰機制,這樣用戶的離線設備若是某一天上線,只會同步最近一週的歷史記錄,也可能消息超過保留時間反而什麼都沒同步哦🤷♀️登錄
對於較長時間不上線的用戶,上線後須要拉取的離線消息比較多,若是一條一條下推會致使整個過程很長,客戶端看到的就是一條一條消息蹦出來,體驗會不好。所以,針對離線消息的下推會採用總體打包、壓縮推送的方式來把多條消息合併成一個大包推下去,不只能減小網絡傳輸時間,還能節省用戶的流量消耗。實現上能夠經過 header
標識告知客戶端這是一個壓縮過的打包消息,客戶端收到後解壓便可。打包
這篇文章學完後,感受有不少不明白的地方,但看完精選留言後又茅塞頓開,仍是要多學習、多思考。終端