1 ポイント 投稿者 GN⁺ 2025-04-02 | 1件のコメント | WhatsAppで共有

エッジレプリケーションへの新しいアプローチ

  • データ同期は、思っている以上に難しい問題。既存のソリューションは、データセット全体をクライアントに同期する方式か、論理的な変更を追跡する方式に大きく分かれる。
  • Graftはこうした問題を解決するために設計されており、シンプルな物理レプリケーションと効率的な論理レプリケーションを組み合わせたオープンソースのストレージエンジン。

遅延同期: 必要な速度で同期

  • Graftはクライアントがいつ同期するかを選べるようにしており、断続的にしかネットワークへ接続しないエッジ環境に適している。
  • サーバーは、クライアントの最後のスナップショット以降に変更されたページのインデックスを提供し、クライアントは必要なデータだけを選択的に取得できる。

部分同期: 必要なものだけ同期

  • エッジ環境ではデータセット全体をダウンロードできないため、Graftは必要なページだけを選択的に取得する部分同期をサポートする。
  • Graftは一般的な予測アルゴリズムとドメイン知識を活用し、必要なページを事前取得できる。

エッジ: 必要な場所の近くで同期

  • Graftは世界中のエッジサーバーを通じてデータを提供し、ユーザーがどこにいても低レイテンシと高い応答性を維持する。
  • クライアントは軽量に設計されており、ブラウザー、モバイルアプリ、サーバーレス環境に簡単に統合できる。

一貫性: 安全な同期

  • Graftは強力な一貫性モデルを提供し、クライアント間の競合を安全に処理する。
  • クライアントはスナップショット分離モデルによってデータの一貫したビューを得られ、書き込みは厳密に直列化される。

Graftで何が作れるのか?

  • Graftはさまざまなエッジネイティブアプリケーションに向けた強力な基盤を提供する。
  • オフラインファーストアプリ、クロスプラットフォームデータ、ステートレスな読み取りレプリカ、任意データのレプリケーションなどが可能。

GraftのSQLite拡張 (libgraft)

  • libgraftはSQLiteのネイティブ拡張で、クライアントが実際に使うデータベースの一部だけを複製することで、リソースが限られた環境でもSQLiteを実行できるようにする。
  • 非同期レプリケーション、遅延部分レプリケーション、スナップショット分離、ポイントインタイムリカバリなどの機能を提供する。

参加方法

  • GraftはGitHubで開発されており、コミュニティからの貢献を歓迎している。
  • Discordに参加するか、メールでフィードバックを送ることができる。
  • Graft管理サービスのウェイトリストに登録できる。

ロードマップ

  • Graftはまだ開発中で、WebAssembly対応、SQLSyncとの統合、さまざまなクライアントライブラリ対応などの計画がある。
  • 書き込みレイテンシの削減、ガベージコレクション、認証と認可、ボリュームフォーク、競合処理などの機能も追加予定。

他のSQLiteレプリケーションソリューションとの比較

  • GraftはmvSQLite、Litestream、cr-sqlite、Cloudflare Durable Objects、Cloudflare D1、Turso & libSQL、rqlite & dqlite、Verneuilなどと比べて独自の強みを持つ。
  • 部分レプリケーション、任意のデータ構造のサポート、エッジでの効率的なレプリケーションなどが主な差別化要因。

1件のコメント

 
GN⁺ 2025-04-02
Hacker Newsのコメント
  • 一貫性モデルが理解できない

    • Graftクライアントはローカルでコミットし、非同期にリモートへのコミットを試みる
    • 2つのクライアントが同じスナップショットを基に同時にコミットすると、片方は成功し、もう片方は失敗する
    • APIは単一のコミット操作しか提供しない
    • ローカルコミットが成功したときに非同期伝播が失敗すると、ロールバックしなければならない問題が発生する
    • 「コミット」という概念が複数の意味で混在している
  • Graftの作者が感謝を伝える

    • ワシントンDCでAntithesis BugBashに参加中
    • ワシントンにいる人たちと会いたいと思っている
  • 一貫性モデルはgitに似ていると理解した

    • ローカルコピーを変更して「push」するときに競合が起こりうる
    • 競合をきれいに検出する方法がない
    • 読み取り競合によって競合が発生する可能性がある
  • クライアントがGraftを取得すると、何が変更されたのかを正確に把握できる

    • Cloud-Backed SQLiteのマニフェストと比較している
    • サーバー側で計算する必要がない
  • 実装の詳細には触れていない

    • アプリ開発者が同期を意識しなくてよい同期レイヤーが必要
    • サブスクリプションなしで個人向け同期をサポートできる
  • VFSを使うのは面白い「ハック」だと思う

    • オフラインファーストのIDE向けに独自の同期エンジンを開発中
    • ツリー構造を使っており、競合解決が課題になっている
  • Leapアルゴリズムを使ったプロジェクトがとても興味深い

    • SQLite統合に集中しがちだが、より一般的で低レベルな分散ストレージの問題としてアプローチしている
    • 具体的な経験のない一般的なソリューションは危険になりうる
  • モバイルクライアントが低速な接続にいると問題が起こる可能性がある

    • 遅い同期を検知し、サーバーに直接クエリを送るハイブリッドアプローチを提案
  • ページを基本の同期単位として使うアプローチが興味深い

    • 同時接続ユーザーが多いと競合が発生しうる
    • OTやCRDTのほうが良いかもしれない
  • 非常に難しい問題だ

    • React Nativeアプリで試してみたい