需求背景
開發通訊錄雲端備份/還原功能,核心痛點在於:如何高效實現增量上傳(僅同步變更)、頭像變更偵測,以及是否需要像 QQ 同步助手「時光機」那樣做全量歷史快照。
增量同步核心策略:客戶端維護「指紋」
採用客戶端計算、雲端比對的輕量架構:
- 本地生成指紋:每次成功同步後,客戶端對每筆聯繫人資料(含姓名、電話、Email、備註等核心欄位)計算一個唯一雜湊值(如 MD5、SHA-256),連同聯繫人 ID 存入本地「同步狀態表」。
- 頭像指紋獨立處理:頭像檔案單獨計算雜湊(如 MD5),存入同步狀態表的
avatar_hash 欄位。上傳時先比對雜湊,未變則跳過檔案上傳,僅同步元資料。
- 增量上傳流程:
- 掃描本地通訊錄,計算當前各聯繫人指紋。
- 與本地「同步狀態表」比對:新增、修改(指紋不同)、刪除(本地無、狀態表有)三類差異。
- 組裝差異資料包(JSON/Protobuf),一次請求發送給伺服器。
- 伺服器應用差異,回傳成功確認。
- 客戶端更新「同步狀態表」指紋與時間戳。
關於「時光機」全量歷史快照
QQ 時光機功能屬於版本控制/備份快照範疇,非即時同步必需。若產品需支援「恢復至任意歷史時間點」,則需在伺服器端實作全量快照機制(如每日全量備份 + 增量 WAL 日誌),客戶端無需每次上傳全量。一般增量同步僅保留「最新狀態」,不具備時光機能力。
關鍵細節補充
- 去抖動:本地變更頻繁時,合併短時間內多次變更為單次同步任務。
- 衝突解決:多端同時修改同一聯繫人,採用「最後寫入勝」或欄位級合併策略,並保留衝突版本供用戶選擇。
- 大頭像處理:頭像建議壓縮至 200KB 以內(如 300x300 JPEG 0.8 品質),並支援斷點續傳。
總結
增量同步核心在於客戶端持久化指紋狀態,頭像以獨立雜湊比對避免重複傳輸。全量歷史快照屬於進階備份功能,按產品規劃決定是否在伺服器端實作,不應混淆於日常增量同步邏輯中。