Các nhà phát triển tranh luận về SQLite và PostgreSQL cho ứng dụng Local-First khi các giải pháp đồng bộ mới xuất hiện

Nhóm Cộng đồng BigGo
Các nhà phát triển tranh luận về SQLite và PostgreSQL cho ứng dụng Local-First khi các giải pháp đồng bộ mới xuất hiện

Cộng đồng phát triển ứng dụng local-first đang tích cực thảo luận về các giải pháp cơ sở dữ liệu tốt nhất để xây dựng các ứng dụng phản ứng, có khả năng hoạt động offline. Cuộc thảo luận này đã trở nên sôi nổi hơn sau báo cáo kinh nghiệm chi tiết của một nhà phát triển so sánh các cách tiếp cận khác nhau để xây dựng công cụ đồng bộ với SQLite và PostgreSQL .

Electric và PGlite cho thấy tiềm năng nhưng gặp vấn đề về khả năng mở rộng

Một số nhà phát triển đã thử nghiệm Electric SQL kết hợp với PGlite , một implementation PostgreSQL dựa trên WebAssembly chạy trong trình duyệt. Mặc dù sự kết hợp này mang lại lợi thế sử dụng cùng một công cụ cơ sở dữ liệu cả ở local và trên server, các thành viên cộng đồng đã báo cáo những thách thức hiệu suất đáng kể. Vấn đề đáng chú ý nhất là thời gian khởi động vượt quá một phút khi cơ sở dữ liệu ngày càng lớn, chủ yếu do thiếu các tính năng nén. Rò rỉ bộ nhớ và các vấn đề ổn định với các hoạt động đồng thời cũng xuất hiện khi cơ sở dữ liệu mở rộng quy mô.

Thú vị là, một contributor chính của dự án Electric đã thừa nhận những hạn chế này và tiết lộ rằng chính những vấn đề này đã thúc đẩy việc tạo ra TanStack DB , một datastore phía client dựa trên JavaScript được thiết kế để đồng bộ native và backend agnostic.

Các Vấn Đề Hiệu Suất Thường Được Báo Cáo:

  • Thời gian khởi động PGlite: Hơn 1 phút đối với các cơ sở dữ liệu lớn hơn
  • Rò rỉ bộ nhớ: Xảy ra khi tăng các yêu cầu LISTEN đồng thời
  • Vấn đề về tính ổn định: Trong chế độ người dùng đơn với kích thước cơ sở dữ liệu ngày càng tăng
  • Thiếu tính năng nén: Dẫn đến tình trạng phình to cơ sở dữ liệu theo thời gian
  • Chi phí phụ trội WASM: Hiệu suất truy vấn chậm hơn so với các triển khai native

SQLite đạt được sức hút cho các ứng dụng đơn người dùng

Cuộc thảo luận đã làm nổi bật sự phổ biến ngày càng tăng của SQLite cho các ứng dụng local-first, đặc biệt là các tình huống đơn người dùng như ứng dụng ghi chú. Các nhà phát triển đang nhận thấy rằng tính chất nhẹ và ổn định của SQLite làm cho nó rất phù hợp với các ứng dụng dựa trên trình duyệt sử dụng các implementation WebAssembly như wa-sqlite . Thách thức chính với SQLite là triển khai tính phản ứng, vì nó thiếu chức năng LISTEN của PostgreSQL cho thông báo thay đổi thời gian thực.

Các thành viên cộng đồng đã chia sẻ các giải pháp sáng tạo, bao gồm sử dụng database triggers để ghi lại các thay đổi và Broadcast Channel API để thông báo cho các phần khác nhau của ứng dụng về các cập nhật. Cách tiếp cận này đã chứng minh hiệu quả trong việc tạo ra các ứng dụng phản ứng hoàn toàn có cảm giác phản hồi như các giải pháp in-memory.

Các giải pháp polling đơn giản chứng minh hiệu quả cho nhiều trường hợp sử dụng

Một xu hướng thú vị trong cuộc thảo luận cộng đồng là sự nhận thức rằng các công cụ đồng bộ phức tạp có thể là quá mức cần thiết cho nhiều ứng dụng. Đối với các ứng dụng đơn người dùng có kết nối internet ổn định, các nhà phát triển đang tìm thấy thành công với các hệ thống polling dựa trên timestamp đơn giản để lấy các thay đổi mỗi vài giây. Cách tiếp cận này sử dụng các yêu cầu JSON đơn giản và có thể được triển khai với mã tối thiểu trong khi vẫn cung cấp trải nghiệm người dùng xuất sắc.

Xây dựng một công cụ đồng bộ có thể là một trải nghiệm học tập tốt, nhưng đối với phần mềm sản xuất, tốt hơn là chọn thứ gì đó đã đối mặt và giải quyết tất cả các trường hợp edge kỳ lạ mà bạn gặp phải khi xây dựng một công cụ đồng bộ và lưu trữ bền vững trên trình duyệt.

Các Giải Pháp Cơ Sở Dữ Liệu Local-First Chính Được Đề Cập:

Giải Pháp Database Engine Tính Năng Chính Phù Hợp Nhất Cho
Electric + PGlite PostgreSQL (WASM) Đồng bộ chi tiết, hỗ trợ LISTEN Ứng dụng cộng tác đa người dùng
TanStack DB Dựa trên JavaScript Đồng bộ tự nhiên, backend agnostic Kho dữ liệu phía client tổng quát
Evolu SQLite Mã hóa E2E, engine đồng bộ Ứng dụng tập trung vào bảo mật
wa-sqlite SQLite (WASM) Nhẹ, ổn định Ứng dụng người dùng đơn lẻ
Custom polling Bất kỳ Đồng bộ đơn giản dựa trên timestamp Nhu cầu đồng bộ độ phức tạp thấp

Các giải pháp thay thế và công cụ chuyên biệt

Cộng đồng cũng đã làm nổi bật một số giải pháp có sẵn cho các trường hợp sử dụng khác nhau. Evolu cung cấp đồng bộ dựa trên SQLite với mã hóa end-to-end, trong khi các công cụ như Reflect đã triển khai thành công các cách tiếp cận tương tự trong sản xuất. Một số nhà phát triển làm việc trên các ứng dụng chuyên biệt, chẳng hạn như hệ thống smart home sử dụng CRDTs qua CAN bus và Bluetooth , đang xây dựng các giải pháp tùy chỉnh từ đầu do các ràng buộc nền tảng độc đáo.

Cuộc thảo luận tiết lộ một hệ sinh thái đang trưởng thành nơi các nhà phát triển có thể chọn từ các công cụ ngày càng tinh vi hoặc xây dựng các giải pháp tùy chỉnh phù hợp với yêu cầu cụ thể của họ. Insight chính nổi lên từ cộng đồng là việc lựa chọn công cụ đồng bộ nên được thúc đẩy bởi các ràng buộc ứng dụng thay vì sở thích kỹ thuật, với các yếu tố như số lượng người dùng đồng thời, tần suất ghi và các mẫu sử dụng offline xác định cách tiếp cận tối ưu.

Tham khảo: Lessons learned from building a sync-engine and reactivity system with SQLite