Firestoreデータバンドル

キャッシュされたFirestoreドキュメントの新しい実装

ファイヤーストアが良くなりました

Firebase Firestoreは最近拡張され、「Firestoreデータバンドル」と呼ばれる新機能を実装するようになりました。そのコアコンセプトは、Firestoreクエリをバイナリ形式でパッケージ化し、CDNまたは他のホスティングソリューションを介して提供できるようになったことです。事実上、これは、データの特定のグループがFirestoreバックエンドから直接フェッチされるのではなく、CDNに取得されるのに適している可能性があることを意味します。したがって、コストを節約できます。

しかし、なぜ?そしてもっと重要なのは、どうやって?!

「Firestoreデータバンドル」は、実際には非常にシンプルな設計です。

  • 最初に、AdminSDKを介してサーバー環境で「データバンドル」参照を作成します
  • 次に、このバンドルには標準のFirestoreクエリがロードされます
  • 次に持っているのは、たとえばファイルとして、またはCDNに保存できるこのデータのバッファーです。
  • クライアント側に切り替えると、新しいFirestoreAPIを使用してCDNからバンドルを実際にロードするだけで済みます。
// On your server ....

/**
 * Generate a buffered bundle for user tempaltes.
 */
async function getUserTemplatesBundle(){
  // Create a bundle with ID 'user-templates'.
  const bundle = firestore.bundle("user-templates");
  
  // A plain Firestore-query.
  const snap = await firestore.collection('user-templates').get();

  return bundle
          .add('user-templates-query', snap)
          .build();
}

// ... then store the buffer, e.g. in your CDN ...
// On your client

import firebase from "firebase/app";
import "firebase/firestore";
import "firebase/firestore/bundle";

// ... init 'firestore' ...

async function loadFirestoreBundle() {
  // Just a simplified call to our demo CDN
  // to fetch the bundle in binary form.
  const rawBundle = await fetchBundleFromCDN();
  // Now tell Firestore to load the bundle
  await firestore.loadBundle(rawBundle);

  // Now get a reference to the bundled query, in
  // our case it's only one query that got bundled.
  const query = await db.namedQuery('user-templates-query');
  
  // Use 'cache' as source so that the data gets
  // cached locally - no Firestore queries will
  // be executed.
  const snap = await query.get({ source: 'cache' });

  // Finally, you can handle the snap like every other
  // Firestore snap in your app.
}

このようなデータバンドルの利点は、例を見るとより明確になります。たとえば、新しいユーザーを作成するときに、Firestore内の新しいドキュメントにデフォルトの値のセットを頻繁に使用するとします。データベースから直接フェッチする代わりに、「Firestore Data Bundles」を使用して、これらの値をCDNからキャッシュされたドキュメントとしてロードし、Firestoreクエリに関連するコストを回避できるようになりました。

したがって、この新機能は、データが頻繁に変更されない、ドキュメントの数がそれほど多くない、このデータセットのフェッチが頻繁に発生するという要件に準拠するドキュメントに最適です。

別の実世界の例

おそらく理想的なユースケースとして、このプログレッシブWebアプリを例として取り上げることもできます。翻訳されたすべてのテキストは、すべてのオーディオファイルへのURL参照と同様にFirestoreインスタンスに保存されます。このデータはあまり変更されないため、たとえあったとしても、FirebaseStorageまたは私のCDNのいずれかにキャッシュするのに非常に適しています。これにより、Firestoreのコストを大幅に削減できる可能性があります。

「Firestoreデータバンドル」は、Firebaseへの非常に優れた追加機能です。今のところユースケースをカバーしていないかもしれませんが、サービスが成長し始めると非常に役立つ可能性があります。