- Là cơ sở dữ liệu phía client, giúp dễ dàng xây dựng các ứng dụng cộng tác thời gian thực như Notion hoặc Figma
- Chỉ cần viết truy vấn quan hệ, Instant sẽ xử lý việc lấy dữ liệu, kiểm tra quyền và bộ nhớ đệm ngoại tuyến
- Khi dữ liệu thay đổi, cập nhật optimistic và rollback cũng được xử lý tự động
- Mọi truy vấn đều hỗ trợ multiplayer theo mặc định
- Cũng hỗ trợ các cập nhật tạm thời như con trỏ hoặc trạng thái online
- Hiện cung cấp SDK cho Javascript, React và React Native
Động lực phát triển
- Việc phát triển ứng dụng hiện đại đòi hỏi rất nhiều công việc như cấu hình server, cơ sở dữ liệu, cache, ORM, thiết lập endpoint, v.v.
- Cũng cần viết mã phía client, quản lý trạng thái và render UI
- Khi thêm tính năng multiplayer, phải tính đến server lưu trạng thái; khi hỗ trợ chế độ offline, phải cân nhắc IndexedDB và hàng đợi giao dịch
- Mỗi khi thêm tính năng mới, lại phải lặp lại việc viết model, endpoint, quản lý trạng thái và UI
- Năm 2021, họ nhận ra rằng phần lớn vấn đề mà kỹ sư UI đối mặt thực chất là vấn đề cơ sở dữ liệu
- Nếu có một cơ sở dữ liệu phía client, chỉ cần viết truy vấn mà không phải nghĩ đến quản lý trạng thái, endpoint hay cache cục bộ
- Nếu truy vấn mặc định hỗ trợ multiplayer, sẽ không cần lo về server lưu trạng thái
- Nếu cơ sở dữ liệu hỗ trợ rollback, bạn sẽ có cập nhật lạc quan miễn phí
- Vì vậy họ phát triển Instant. Instant cung cấp một cơ sở dữ liệu có thể dùng ở phía client để bạn tập trung vào việc xây dựng UX
Tổng quan kiến trúc
- Instant lưu toàn bộ dữ liệu người dùng trong một cơ sở dữ liệu Postgres lớn dưới dạng triple
- Cung cấp free tier bằng cấu hình multi-tenant
- Một sync server viết bằng Clojure giao tiếp với Postgres
- Họ xây dựng một query engine hiểu InstaQL, tương tự Datalog và GraphQL
- Lấy cảm hứng từ WorldStore của Asana và LiveGraph của Figma, hệ thống theo dõi WAL của Postgres để phát hiện dữ liệu mới và vô hiệu hóa các truy vấn liên quan
- Ở frontend, họ xây dựng một triple store phía client
- SDK lưu cache truy vấn gần đây trong IndexedDB trên web và AsyncStorage trên React Native
- Toàn bộ dữ liệu được xử lý thông qua hệ thống phân quyền chạy trên thư viện CEL của Google
Tóm tắt của GN⁺
- Instant là cơ sở dữ liệu phía client, giúp dễ dàng xây dựng ứng dụng cộng tác thời gian thực
- Thông qua truy vấn quan hệ, hệ thống tự động xử lý việc lấy dữ liệu, kiểm tra quyền và cache ngoại tuyến
- Hỗ trợ sẵn multiplayer, cập nhật lạc quan và rollback theo mặc định
- Lấy cảm hứng từ Asana và Figma, hệ thống theo dõi WAL của Postgres để phát hiện dữ liệu mới và vô hiệu hóa các truy vấn liên quan
- Quản lý dữ liệu hiệu quả thông qua triple store phía client và hệ thống phân quyền
2 bình luận
Đây đúng là một dự án rất đáng mong đợi, cùng xu hướng với Supabase.
Ý kiến trên Hacker News
Nhà sáng lập Firebase: Hào hứng với sự kết hợp của Instant gồm offline, thời gian thực, truy vấn quan hệ và mã nguồn mở. Đã có rất nhiều yêu cầu về truy vấn quan hệ. Client của Firebase là mã nguồn mở nhưng backend thì đã không thể mã nguồn mở hóa
Phản hồi: Ví dụ code chưa hoàn chỉnh. Nguồn gốc của
transactvàuseQuerykhông rõ ràng. Những chi tiết nhỏ rất quan trọngKhả năng self-hosting: Nhiều khi một phần của công cụ không thể self-host. Cần làm rõ điều này
Giải pháp thay thế cho mô hình offline-first: Đã chọn PowerSync. WatermelonDB cũng ổn. ElectricSQL vẫn còn non. CouchDB và PocketDB không còn mới. Dự định dùng PowerSync và Supabase làm backend
Mối quan hệ với ứng dụng CRUD: Khó hiểu mối quan hệ giữa ứng dụng CRUD với các khái niệm của InstantDB hoặc Firebase. Với trình soạn thảo văn bản cộng tác thì sẽ dùng triển khai CRDT bằng Javascript
Trải nghiệm dùng Instant: Đã dùng Instant suốt 6 tháng và rất hài lòng. Các tính năng thời gian thực, quan hệ và offline là rất quan trọng. Đã thử công cụ khác nhưng đều thất bại. Từ sau Instant thì không dùng công cụ nào khác nữa
Tóm tắt hệ thống quyền hạn: Firebase tách logic tìm kiếm/cập nhật dữ liệu khỏi chính sách truy cập. Instant đánh giá logic quyền hạn dựa trên kết quả truy vấn. Firebase kiểm tra tính an toàn trước khi thực thi truy vấn
Có lộ ra Datalog engine hay không: Có các Datalog engine khác hỗ trợ truy vấn đệ quy. Đang hỏi về khả năng cache truy vấn và join. Trước đây đã có một Java InstantDB trùng tên. Đồng thời cung cấp danh sách các Datalog engine khác được triển khai bằng Clojure
Muốn trải nghiệm kiểu ActiveRecord: Muốn làm việc theo cách giống ActiveRecord trong React/Vue/Solid. Muốn một API kiểu object graph. Không muốn API kiểu SQL. Muốn ORM hoạt động như thể toàn bộ object graph nằm trong bộ nhớ
Vấn đề hiệu năng của triple store: Triple store thường cho hiệu năng kém khi đa số truy vấn lấy toàn bộ object hoặc nhiều field của cùng một object. Postgres cũng không quá nổi bật. Đang hỏi về kinh nghiệm liên quan đến vấn đề này