開源照片管理平台 Immich 推出了行動同步系統的完整重新設計,解決了長期以來困擾擁有大型照片庫用戶的效能問題。全新的 Sync v2 實作承諾解決記憶體問題、減少電池耗電量,並消除困擾原始系統的同步失敗問題。
串流架構取代記憶體密集型方法
最重要的變化是從在記憶體中處理整個資料塊轉換為串流方法。新系統以小塊方式從 PostgreSQL 資料庫讀取資料,逐步序列化,並使用 JSON Lines 格式透過 HTTP 傳送。這消除了一次性將大量照片中繼資料載入記憶體的需求,先前這種做法會導致應用程式在同步操作期間凍結或當機。
JSON Lines 是一種資料格式,每一行包含一個獨立的 JSON 物件,使得逐一處理資訊變得更容易,而不是一次處理所有資訊。
Sync v2 關鍵改進
- 端到端串流傳輸:資料以區塊形式從伺服器資料庫流向行動裝置資料庫
- 可恢復同步:網路中斷不再需要重新開始
- 增量更新:僅傳輸已變更的資料
- 記憶體效率:消除記憶體中的大型 JSON 物件
- UUIDv7 實作:基於時間的唯一識別碼,確保可靠排序
- JSON Lines 格式:每行包含獨立的 JSON 物件以支援串流傳輸
可恢復同步避免重新開始
其中一個最受歡迎的功能解決了用戶常見的困擾,即網路中斷會強制整個同步程序從頭開始重新啟動。新系統使用檢查點和確認權杖來追蹤進度,允許用戶在連線中斷時從中斷的確切位置恢復。
實作依賴於 UUIDv7 識別碼,它結合時間戳記與唯一值來建立可靠的排序系統。這確保即使同時處理多張照片,同步也能準確判斷從何處繼續。
UUIDv7 是一種特殊類型的識別碼,在其前 48 位元中包含時間戳記資訊,使其既獨特又按時間排序。
社群回應突顯持續挑戰
Immich 社群的用戶對效能改善表達了熱忱,同時也強調了仍需關注的其他問題。數位用戶回報了來自 iCloud 照片的時間戳記處理問題,以及偶爾需要重新啟動應用程式的上傳失敗問題。
「我只注意到行動應用程式有兩個問題,其中一個與效能有關 - 它會卡在上傳圖片到伺服器的過程中,無論等待多久都無法完成。」
討論也顯示了社群對專案的強力支持,許多用戶成功從 Google Photos 遷移到自架的 Immich 安裝。然而,一些用戶注意到缺少雙向同步等功能,即從裝置刪除照片也會從伺服器移除它們。
技術實作細節
開發團隊透過實作資料庫觸發器來暫時保存刪除記錄,解決了追蹤已刪除項目的挑戰。這允許行動裝置在下次同步週期中了解刪除情況,確保跨平台的資料一致性。
從 TypeORM 轉換到 Kysely 進行資料庫操作已在應用程式的其他部分顯示效能改善,有助於整體系統最佳化。
新的同步系統代表了 Immich 邁向穩定版本的關鍵一步,解決了管理超過 100,000 個資產的大型照片收藏用戶面臨的最後一個主要技術障礙。
參考資料:Sync v2
