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