Local-first software: Kiến trúc mới thay thế cloud dependency

Local-first software là gì? Kiến trúc mới thay thế cloud dependency

Trong thập niên qua, phần mềm người dùng phụ thuộc hoàn toàn vào cloud — từ Google Docs, Notion đến Linear, Figma. Nếu mất kết nối mạng, bạn không chỉ offline mà còn mất khả năng đọc/ghi dữ liệu. Local-first software (phần mềm ưu tiên local) lật ngược mô hình này: dữ liệu chính tồn tại trên thiết bị cá nhân, cloud chỉ đóng vai trò sync và backup. Vì vậy, app vẫn hoạt động 100% offline, không bị vendor lock-in, và người dùng sở hữu dữ liệu thực sự.

Khái niệm này không mới — desktop apps truyền thống vốn local-first — nhưng mới khi áp dụng vào web và mobile, nơi browser đã quen “cloud = database”. Với các công cụ đồng bộ offline như Automerge, Yjs, ElectricSQL, giờ developer có thể build web app với khả năng real-time collaboration mà không cần backend riêng.

Ba trụ cột của local-first software

  • Local storage chính: IndexedDB, SQLite, hoặc OPFS (Origin Private File System) lưu data trên device.
  • Sync engine: Conflict resolution, CRDT/OT merge dữ liệu giữa nhiều device.
  • Cloud optional: Sync server chỉ relay encrypted patches, không đọc nội dung.
Local-first software architecture showing device, sync engine, and cloud backup layers
Local-first software architecture showing device, sync engine, and cloud backup layers

Automerge: CRDT-based document sync

Automerge là thư viện CRDT (Conflict-free Replicated Data Type) cho JavaScript. CRDT đảm bảo hai bản sao cùng update song song vẫn merge được mà không cần coordinator — thích hợp cho offline-first apps. Khi device có mạng, Automerge gửi compressed binary patch lên sync server; server chỉ forward patch, không giải mã.

Use case phổ biến: collaborative text editor, note-taking app, offline map. Automerge hỗ trợ JSON natively, nên bạn có thể lưu văn bản, list, nested object mà không cần define schema phức tạp.

Automerge hoạt động dựa trên nguyên lý CRDT (Conflict-free Replicated Data Type), một loại cấu trúc dữ liệu cho phép các bản sao được cập nhật độc lập và sau đó hợp nhất mà không xảy ra xung đột. Điều này làm cho Automerge trở nên lý tưởng cho các ứng dụng làm việc offline mà vẫn cần khả năng đồng bộ khi kết nối lại mạng.

Code editor showing Automerge CRDT merge visualization
Code editor showing Automerge CRDT merge visualization

Yjs: High-performance shared data types

Yjs là CRDT framework tập trung vào performance cho real-time editing. Khác Automerge (general-purpose), Yjs cung cấp shared data types sẵn: Y.Text, Y.Array, Y.Map, Y.XmlFragment. Typing vào Y.Text giống như cursor trong collaborative editor — cursor của người khác hiện real-time, và conflict resolved tự động.

Yjs tích hợp sẵn nhiều editor: CodeMirror 6, Monaco (VS Code engine), ProseMirror, Slate. Nếu bạn muốn build Google Docs clone, Yjs + ProseMirror là combo tối ưu.

Yjs được thiết kế để tối ưu cho các ứng dụng cần hiệu suất cao như các trình soạn thảo văn bản thời gian thực. Thay vì lưu trữ toàn bộ trạng thái tài liệu, Yjs chỉ lưu trữ các thay đổi (diffs) và áp dụng chúng khi cần thiết, giúp giảm tiêu thụ bộ nhớ và tăng tốc độ xử lý.

Real-time collaborative editing with multiple cursors in shared text editor
Real-time collaborative editing with multiple cursors in shared text editor

ElectricSQL: Local-first với Postgres

Automerge và Yjs dùng custom binary format — khó query trực tiếp. ElectricSQL giải quyết bằng cách sync local SQLite với remote Postgres. Mỗi device chạy SQLite local; Electric syncs changes qua logical replication. Bạn vẫn viết SQL thông thường (SELECT * FROM tasks WHERE done = false), nhưng data đọc local thay vì round-trip server.

ElectricSQL phù hợp cho app cần query phức tạp hoặc migrate từ monolith cloud. Ví dụ: CRM, todo app với filter phức tạp, inventory system.

ElectricSQL cho phép các nhà phát triển sử dụng SQL quen thuộc mà vẫn có khả năng hoạt động offline. Khi thiết bị offline, tất cả các truy vấn được thực hiện trên SQLite local. Khi kết nối lại mạng, ElectricSQL sẽ đồng bộ các thay đổi giữa local SQLite và remote Postgres thông qua logical replication, đảm bảo dữ liệu luôn nhất quán.

So sánh Automerge, Yjs, ElectricSQL

Tiêu chí Automerge Yjs ElectricSQL
Data model General-purpose CRDT (JSON) Shared data types (Text, Array, Map) SQL (SQLite ↔ Postgres)
Performance Trung bình Cao (binary protocol) Cao (SQLite local)
Query capability Yếu (no index) Trung bình Mạnh (full SQL)
Ecosystem Nhỏ, đang phát triển Lớn (nhiều editor integrations) Nhỏ, tập trung Postgres
Use case Generic offline-first Collaborative editing Data-heavy offline apps

Trade-off: Khi nào nên chọn local-first?

Local-first không phải giải pháp cho mọi app. Hãy cân nhắc:

  • Phù hợp: Note-taking, task manager, document editor, offline map, customer data với privacy requirement.
  • Không phù hợp: Social feed cần server-side ranking, multi-tenant SaaS với strict data isolation, real-time dashboard cần authoritative state.

Chi phí: sync engine phức tạp hơn REST API, cần xử lý tombstone, garbage collection, migration schema giữa versions. Automerge/Yjs đang cải thiện tooling, nhưng production vẫn cần engineering effort.

Kết luận

Local-first software đánh dấu sự trưởng thành của web platform: browser giờ có IndexedDB, OPFS, Service Worker, WebTransport — đủ xây app độc lập hoàn toàn. CRDT sync engines như Automerge và Yjs cung cấp foundation cho real-time collaboration mà không cần backend phức tạp. Với ElectricSQL, team có data-heavy apps cũng có thể migrate sang local-first mà mất công migrate tối thiểu.

Nếu bạn đang build app mới, hãy hỏi: “Tại sao data phải lên server trước khi user đọc?” Nếu không có câu trả lời thuyết phục, local-first có thể là lựa chọn đúng đắn.

Nguồn tham khảo: Automerge docs, Yjs guide, ElectricSQL architecture paper, Ink & Switch research, “Local-first software” essay.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Hono Framework là gì? Web framework edge siêu nhẹ chỉ 14KB

Hono Framework là gì? Hono (có nghĩa là “lửa” trong tiếng Nhật 🔥) là một web framework siêu nhẹ được xây dựng hoàn toàn trên Web Standards. Nó cho phép…

Xem thêm

Cloudflare R2: Object storage zero egress thay thế S3

Cloudflare R2 là gì? Cloudflare R2 là dịch vụ object storage được thiết kế để thay thế Amazon S3 mà không tính phí egress. Ra mắt từ 2021, R2 đã…

Xem thêm

GaN charger là gì? Công nghệ sạc Nitride Gallium hiệu suất cao và nhiệt thấp

GaN charger là gì? Công nghệ sạc Nitride Gallium hiệu suất cao và nhiệt thấp GaN charger (sạc GaN – Gallium Nitride) đang thay thế hoàn toàn dòng sạc silicon…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất