Syncular 0.5.0 – 離線優先 SQL 同步,使用 TypeScript 與 Rust 核心
總覽
Syncular 0.5.0 提供離線優先的 SQL 同步,每個客戶端維護一個真實的本地 SQLite 資料庫,寫入會先經由樂觀 outbox 持久化,然後再由伺服器權威的提交日誌進行驗證與排序。
此項目為自行託管,尚未達到 1.0,且不提供代管服務或點對點模式。原生打包成熟度在各生態系統間有所不同。
架構
客戶端將資料存放在真正的 SQLite 資料庫中:在瀏覽器中使用由 Origin Private File System (OPFS) 支援的 sqlite‑wasm;其他環境則使用原生 SQLite。所有寫入會在本地套用,同時在同一個交易內記錄到持久的 outbox。伺服器維護單一有序的提交日誌,作為真相來源,驗證進入的變更,並使用應用後端中定義的明確範圍來解決它們。
協議與規格優先方法
Syncular 的協議在 SPEC.md 中獨立於其實作進行規範,spec/vectors/ 中的金色位元組向量作為標準參考。當規格與程式碼分歧時,會調整程式碼以符合規格。協議草案名為 SSP2,並包含一種標準的二進位編碼。
兩個獨立的核心——一個用 TypeScript 編寫,另一個用 Rust 編寫——透過一個與實作無關的適合性套件保持同步,該套件會對兩個實作各跑 95 個場景。
客戶端核心與繫結
TypeScript 核心驅動網頁客戶端(@syncular/client),其運行於 @sqlite.org/sqlite-wasm。Rust 核心透過 Swift、Kotlin、Flutter、React Native、Tauri、純 Rust 以及一個小型 C API 的語言繫結暴露出來。
這些繫結使開發者能將 Syncular 整合到原生行動與桌面應用程式中,同時共享相同的同步邏輯。
主要功能
- 透過 WebSocket 進行即時同步,並具備可恢復的啟動段落,以實現高效的初始同步。
- 明確的衝突證據會被記錄,以協助應用程式理解並解決分歧的變更。
- 授權撤銷與本地清除可移除使用者的權限,並從客戶端刪除其資料。
- 窗口副本允許客戶端僅根據定義的範圍同步資料的子集。
- 二進位大型物件(blobs)與常規 SQL 資料一起受到支援。
- 可選的 CRDT 欄位可用,並由位於
packages/crdt-yjs目錄中的 Yjs‑based 合併器提供支援。 - 每欄加密為選定欄位提供端到端的機密性。
- 透過
typegen套件,為五種語言提供類型安全的查詢產生,該套件會從共享的中間表示發出具備 schema 感知的輔助函式。
開發實務
Syncular 採用規格優先的方法:規格是正確性的仲裁者。測試原則要求在整合測試中使用迴圈記憶體傳輸,在傳輸層進行故障注入,以及明確的就緒訊號——測試中禁止使用 sleep。真實的 socket 測試數量有限且被隔離。
此倉庫鼓勵「一條好路」:瀏覽器持久化到 OPFS,並將不支援的環境回報為錯誤;同步則透過 WebSocket 進行。
關於 AI 協助,專案的貢獻指南指出,歡迎使用大型語言模型來編寫測試、重現、基準測試、文件和生產程式碼,前提是每一行都經過審閱、理解,並準備好進行辯護;低努力的機器生成貢獻將在不評論的情況下被關閉。
部署與限制
截至最新版本(v0.5.0,2026 年 7 月 14 日),Syncular 仍處於 pre‑1.0 階段。它僅設計為自行託管部署;不提供代管服務或點對點模式。README 說明原生打包成熟度仍隨生態系統而異,意即某些語言繫結可能比其他更成熟。
社群問題與作者回覆
- CRDT 處理在 SQL 中:作者指出 Syncular 提供可選的 CRDT 欄位,透過 Yjs 合併器實作,允許應用程式針對特定欄位選擇加入無衝突複寫資料類型,同時保持其餘資料模型為關聯式。
- 衝突解決:Syncular 不採用自動衝突解決演算法,而是記錄明確的衝突證據,將解決政策交給應用程式開發者。
- 與 PowerSync 的比較:作者未提供直接比較;該專案的文件未提及 PowerSync。
- 瀏覽器儲存驅逐:作者確認待處理的寫入位於由 OPFS 支援的 SQLite 資料庫中,但未說明該庫是否會請求持久儲存或警告使用者可能的 outbox 驅逐。
- 使用 LLM:作者表示在 Syncular 的開發期間,LLM 協助主要用於編寫測試和迭代技術概念,並在所有貢獻上套用同樣嚴格的審核標準。
這些觀點直接取自該倉庫的 README、發行說明以及作者在 Hacker News 貼文上的評論。
結論
Syncular 0.5.0 提供一個以規格驅動、離線優先的 SQL 同步方案,擁有雙重 TypeScript 與 Rust 執行時期、持久的 outbox 模型,以及一套功能,範圍從加密欄位到可選的 CRDT 支援,旨在滿足需要自行託管、具備即時能力的同步,而不依賴代管服務的開發者。