訊息同步 —— 在 Airbnb 我們是怎樣擴充套件移動訊息的

洪朔-Tuccuay發表於2019-02-27

訊息同步 —— 在 Airbnb 我們是怎樣擴充套件移動訊息的
弱網環境下的新舊收件箱對比

隨著從移動端發出的訊息條數超過每小時 100k,訊息傳遞成為了 Airbnb 應用中被使用得最頻繁的功能,但是我們之前用在移動版收件箱中獲取訊息的方法緩慢且不能保證資料的一致性,必須要有網路連線才能閱讀訊息。這些原因導致了移動版收件箱的房東和遊客的體驗都不太好。為了讓收件箱更快、更可靠、更一致,我們在 Airbnb 中構建了訊息同步機制。

舊版收件箱的實現方式類似於上世紀末的郵箱客戶端,使用者每點選一次,就網路載入一次,從而獲取需要展示的訊息。通過訊息同步,只有當資料改變時才會更新訊息內容和訊息列表,從而大大減少了網路請求的數量。這意味著在收件箱和訊息列表之間來回切換導航的速度快了很多,大部分時間都是用本地快取來展示資料,而不再需要在進入每個介面的時候都發起網路請求。訊息同步還減少了每個網路請求的響應大小,從而使 API 的響應速度提升了兩倍之多。這些體驗優化在網速較慢的地區尤為明顯。

以下為訊息同步的工作方式,分三種情況:

情景 1: 全幅增量更新

訊息同步 —— 在 Airbnb 我們是怎樣擴充套件移動訊息的

常見的情景是這樣的:

  1. 移動客戶端使用本地儲存的 sequence_id (比如 1490000000,表示客戶端上一次與伺服器同步的時間)請求同步。
  2. API 伺服器只返回所有已修改的訊息物件和新的訊息並附帶一個新的 sequence_id (比如 1491111111)。
  3. 移動客戶端將這些被修改的訊息和新的訊息和本地資料庫合併。
  4. 移動客戶端還要儲存新的 sequence_id 以供下次使用。

情景 2:初始化同步

這是在有大量的訊息更新需要返回時的方案。比如當使用者首次下載 app 的時候,伺服器需要傳送 10 個會話物件和 30 個訊息以進行全增量更新。完整的增量同步響應體將會非常巨大,這將導致更長的載入時間和更差的使用者體驗。所以這個時候,我們只返回當前螢幕需要展示的會話。

訊息同步 —— 在 Airbnb 我們是怎樣擴充套件移動訊息的

  1. 移動客戶端使用本地儲存的 sequene_id 來呼叫同步 API。
  2. API 伺服器估計完全增量同步的響應體大小,並且判斷覺得它太大了。
  3. API 伺服器僅返回最新 N 個會話物件,足夠客戶端渲染整個螢幕而沒有空白。
  4. 客戶端清除本地的資料庫。
  5. 客戶端儲存最新的訊息和 sequence_id
  6. 當使用者開啟會話時,客戶端會向伺服器請求這個會話的所有訊息。
  7. 當使用者在收件箱中瀏覽歷史記錄時,客戶端會傳送分頁請求來獲取會話的訊息。

情景 3:刪除會話

會話有時候會需要從應用中移除。比如當房東搭檔不再管理這個房子的時候,伺服器將刪除房東搭檔和房客之間的會話。在這種情況 API 會在最後一次同步時傳送包含所有需要刪除的會話 ID 陣列。

迴歸測試

當遷移到新的訊息同步 API 的時候,有幾個需要注意的點:

  1. Airbnb 的訊息系統與核心的預定流程及其它產品邏輯緊密結合。伺服器需要監聽那些會影響資料在螢幕上顯示的變動。比如當行程完成後,應用需要在會話中顯示「評價」按鈕。我們當時有兩種方案可選:一個是在閱讀訊息的時候檢查評論物件是否被修改;另一個是訂閱評論物件的狀態並在下一次讀取會話訊息的時候改變它。我們選擇了第二種方案,因為這種方案節省資源。但是,監控這些能影響 UI 改變的物件,是一個挑戰。

  2. 更新後的會話可能和本地儲存的會話有不同的順序。我們需要確保在合併資料後能夠正確的重新整理 UI。

為了抓取在舊的訊息 API 和新的訊息同步 API 返回的資料之間的差異,一小部分應用同時執行新舊兩套 API 進行抽查。它記錄兩套 API 返回的會話中所有的屬性值和會話順序。這允許我們對新的 API 迴歸測試並進行快速迭代。每當遇到一個 bug 時,伺服器會將會話物件標記為已修改,以便在下一次同步時糾正錯誤。

結論

  1. 訊息同步 API 將請求的延遲減少了一半。相對於舊的API(下面突出的藍線),新的API的網路請求更加穩定。

訊息同步 —— 在 Airbnb 我們是怎樣擴充套件移動訊息的

  1. 訊息同步使使用者能夠在飛航模式或者網路狀況不佳的情況下閱讀訊息。

在推出訊息同步和其他關於訊息的改進之後,我們看到更多的訊息從手機上傳送了(在 Android 和 iOS 上分別是 +3.8% 和 +5.3%),從網頁上傳送的訊息變少了(-4.6% 和 -4.2%)。並且每天檢視收件箱的次數也提升了(+200% 和 +96%),因為它現在是房東的首頁。這個釋出對於我們房東社群來說是一個非常巨大的勝利,因為訊息是房東在 Airbnb 上最常用的功能。

最後說一下,如果你有興趣創造一個蓬勃發展的社群,在世界各地款待大家,Host & Homes 團隊正在招募工程師 尋找有才華的人加入

訊息同步 —— 在 Airbnb 我們是怎樣擴充套件移動訊息的


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOSReact前端後端產品設計 等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃

相關文章