- クライアントサイドDBであり、Notion や Figma のようなリアルタイム共同編集アプリを簡単に構築できるようにする
- リレーショナルクエリを書けば、Instant がデータ取得、権限確認、オフラインキャッシュを処理
- データ変更時のオプティミスティック更新とロールバックも自動で処理
- すべてのクエリはデフォルトでマルチプレイヤー対応
- カーソルやオンライン状態のような一時的な更新もサポート
- 現在は Javascript、React、React Native 向けの SDK を提供
開発の動機
- 現代のアプリ開発では、サーバー設定、データベース、キャッシュ、ORM、エンドポイント設定など多くの作業が必要
- クライアントサイドコードの作成、状態管理、UI レンダリングも必要
- マルチプレイヤー機能を追加する際はステートフルなサーバーを考慮する必要があり、オフラインモードをサポートする際は IndexedDB とトランザクションキューを考慮しなければならない
- 新機能を追加するたびに、モデル、エンドポイント、状態管理、UI を繰り返し書く必要がある
- 2021 年に、UI エンジニアが直面する問題の大半は実はデータベースの問題だと気づいた
- クライアントサイドデータベースがあれば、状態管理、エンドポイント、ローカルキャッシュを考える必要はなく、クエリを書くだけでよい
- クエリがデフォルトでマルチプレイヤー対応なら、ステートフルなサーバーを心配する必要がない
- データベースがロールバックをサポートしていれば、オプティミスティック更新を無料で得られる
- そこで Instant を開発した。Instant はクライアントで使えるデータベースを提供し、UX 構築に集中できるようにする
アーキテクチャ概要
- Instant はすべてのユーザーデータを 1 つの大きな Postgres データベースにトリプル形式で保存
- マルチテナント構成で無料ティアを提供
- Clojure で書かれた同期サーバーが Postgres と通信
- Datalog と GraphQL に似た InstaQL を理解するクエリエンジンを実装
- Asana の WorldStore と Figma の LiveGraph に着想を得て、Postgres の WAL を追跡して新しいデータを検出し、関連クエリを無効化
- フロントエンドではクライアントサイドのトリプルストアを実装
- SDK は Web では IndexedDB、React Native では AsyncStorage に最新のクエリキャッシュを保存
- すべてのデータは Google's CEL ライブラリで動作する権限システムを通じて処理
GN⁺ のまとめ
- Instant はクライアントサイドデータベースであり、リアルタイム共同編集アプリを簡単に構築できるようにする
- リレーショナルクエリによって、データ取得、権限確認、オフラインキャッシュを自動で処理
- マルチプレイヤー機能とオプティミスティック更新、ロールバックをデフォルトでサポート
- Asana と Figma に着想を得て、Postgres の WAL を追跡し、新しいデータを検出して関連クエリを無効化
- クライアントサイドのトリプルストアと権限システムにより、データ管理を効率的に処理
2件のコメント
Supabaseと同じ系譜で、本当に期待できるプロジェクトですね
Hacker News の意見
Firebase 創業者: Instant のオフライン、リアルタイム、リレーショナルクエリ、オープンソースという組み合わせに興奮している。リレーショナルクエリへの要望は多かった。Firebase クライアントはオープンソースだが、バックエンドのオープンソース化には失敗した
フィードバック: コード例が完全ではない。
transactとuseQueryの出所が明確ではない。細かなディテールが重要だセルフホスティング可能か: ツールの一部がセルフホスティング不可能なことが多い。これを明確にすべきだ
オフラインファーストモデルの代替: PowerSync を選んだ。WatermelonDB も悪くない。ElectricSQL はまだ未成熟だ。CouchDB と PocketDB は最新ではない。PowerSync と Supabase をバックエンドとして使う予定だ
CRUD アプリとの関係: CRUD アプリと InstantDB または Firebase の概念との関係を理解しにくい。協調テキストエディタには CRDT Javascript 実装を使うつもりだ
Instant の使用経験: 6か月間 Instant を使っており、満足していた。リアルタイム、リレーショナル、オフライン機能が重要だった。ほかのツールも試したが失敗した。Instant 以降はほかのツールを使っていない
権限システムの要約: Firebase はデータ取得・更新ロジックとアクセスポリシーを分離している。Instant はクエリ結果に応じて権限ロジックを評価する。Firebase はクエリ実行前に安全性を確認する
Datalog エンジン公開の有無: 再帰クエリをサポートする別の Datalog エンジンがある。クエリキャッシュや結合が可能かどうかを尋ねている。過去に Java の InstantDB と名前が同じだった。Clojure で実装された別の Datalog エンジンの一覧を示している
ActiveRecord のような体験を望む: React/Vue/Solid で ActiveRecord のようなやり方で作業したい。オブジェクトグラフのような API を望んでいる。SQL のような API は望んでいない。ORM がメモリ上に完全なオブジェクトグラフがあるかのように動作してほしい
トリプルストアの性能問題: ほとんどのクエリがオブジェクト全体、または同一オブジェクトの複数フィールドを取得する場合、トリプルストアの性能は良くない。Postgres もそれほど優れているわけではない。これに関する経験を尋ねている