1. 程式人生 > >《即時訊息技術剖析與實戰》學習筆記9——IM系統如何支援訊息的多終端漫遊

《即時訊息技術剖析與實戰》學習筆記9——IM系統如何支援訊息的多終端漫遊

一、什麼是多終端漫遊

多終端漫遊是指:使用者在任意一個裝置登入後,都能獲取到歷史的聊天記錄。如:QQ 預設漫遊 7 天的聊天記錄,開通 VIP 會員可漫遊 30 天,開通 SVIP 會員可漫遊 2 年。

二、多終端漫遊的實現

支援訊息多終端漫遊一般需要兩個條件:

  • 裝置線上狀態
  • 離線訊息儲存
1. 通過裝置的線上狀態來實現

記錄裝置的線上狀態,當用戶在多個終端同時登入併發送訊息時,IM 服務端將收到的訊息推給接收方的多臺線上裝置,同時推給傳送方的其他登入裝置。

可以看到,當多終端同時線上,只需要維護裝置的線上狀態就可以了。

2. 通過離線訊息儲存來實現

上面的圖是假設接收方或傳送方的多臺終端裝置都是線上狀態,若傳送方或接收方使用者的多臺終端裝置中,某些裝置是離線狀態,此時傳送訊息,IM 服務端只會將訊息推送給線上裝置,同時將訊息儲存到伺服器,以便離線裝置上線後同步歷史訊息。

  • 離線訊息的同步機制

使用者的某臺離線裝置上線後,需要知道獲取哪些離線訊息,一般採用版本號實現多終端和服務端的資料同步,保證離線訊息可以做到按需拉取。

同步流程如圖所示:
① 當有訊息需要推送給使用者時,會為每條訊息生成一個版本號,並連同訊息存入離線儲存中,同時更新服務端維護的接收方使用者的最新版本號,並將只攜帶版本號的訊息傳送給傳送方裝置,使傳送方裝置的最新版本號和服務端同步。
② 接收方的線上裝置接收到訊息後,更新本地的最新版本號為收到的最後一條訊息的版本號。
③ 當接收方的離線裝置上線時,會提交本地最新版本號到服務端,服務端比對服務端維護的該使用者的最新版本號和客戶端提交上來的版本號,如不一致,服務端會根據客戶端的版本號從離線儲存獲取“比客戶端版本號新”的訊息,並推送給新上線的客戶端。

  • 離線訊息的儲存

離線訊息的儲存,不僅包括訊息內容本身,還需要儲存一些操作(刪除、撤銷等)的信令。比如:使用者 A 在一臺已上線的裝置刪除/撤銷了某條傳送給使用者 B 的訊息,這個操作的信令也會和訊息一起儲存起來,這樣當用戶 A 的另一臺離線裝置上線時,就不會同步這個已刪除/撤銷的訊息。

所以儲存離線訊息時,會儲存訊息內容、操作信令、訊息對應的版本號。

  • 離線訊息的淘汰機制

離線訊息的儲存成本比較高,因為不知道使用者有幾個裝置,也不知道使用者的離線裝置多久上線,所以離線訊息的儲存一般會有時限和條數的限制,比如保留 1 周時間,最多儲存 1000 條,若在保留時間內訊息超過規定條數,在不超過大小限制和時效限制的前提下,採用 FIFO(先進先出) 的淘汰機制,這樣使用者的離線裝置如果某一天上線,只會同步最近一週的歷史記錄,也可能訊息超過保留時間反而什麼都沒同步哦