Firestore-Datenpakete

Eine neue Implementierung für zwischengespeicherte Firestore-Dokumente

Firestore ist noch besser geworden

Der Firebase Firestore wurde kürzlich verbessert und implementiert jetzt eine neue Funktion namens „Firestore Data Bundles“. Das Kernkonzept besteht darin, dass Firestore-Abfragen jetzt im Binärformat verpackt und über Ihr CDN oder eine andere Hosting-Lösung bereitgestellt werden können. Effektiv bedeutet dies, dass eine bestimmte Gruppe Ihrer Daten möglicherweise gut geeignet ist, nicht direkt aus dem Firestore-Backend, sondern aus einem CDN geholt zu werden und Ihnen somit einige Kosten zu sparen.

Aber warum? Und noch wichtiger, wie?!

„Firestore Data Bundles“ sind eigentlich ganz einfach aufgebaut:

  • Sie erstellen zunächst eine „Datenbündel“-Referenz in einer Serverumgebung über das Admin SDK
  • dann wird dieses Bundle mit Standard-Firestore-Abfragen geladen
  • was Sie dann haben, ist ein Puffer dieser Daten, der beispielsweise als Datei oder in Ihrem CDN gespeichert werden kann
  • Wenn Sie zu Ihrer Client-Seite wechseln, müssen Sie jetzt nur noch die neue Firestore-API verwenden, um das Bundle tatsächlich von Ihrem CDN zu laden
// 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.
}

Der Nutzen eines solchen Datenbündels wird an einem Beispiel deutlicher. Stellen Sie sich vor, Sie verwenden häufig einen Standardsatz von Werten für ein neues Dokument in Ihrem Firestore, beispielsweise beim Anlegen eines neuen Benutzers. Anstatt direkt aus der Datenbank zu holen, können Sie diese Werte jetzt mit „Firestore Data Bundles“ als zwischengespeichertes Dokument aus Ihrem CDN laden und so Kosten vermeiden, die mit einer Firestore-Abfrage verbunden sind.

Diese neue Funktion eignet sich daher am besten für Dokumente, die folgenden Anforderungen entsprechen: Die Daten ändern sich nicht oft, die Anzahl der Dokumente ist nicht sehr groß und es werden häufig viele Abrufe für diesen Datensatz durchgeführt.

Ein weiteres Beispiel aus der realen Welt

Als idealen Anwendungsfall können Sie auch diese progressive Web-App als Beispiel nehmen. Alle übersetzten Texte werden in einer Firestore-Instanz gespeichert, ebenso die URL-Referenzen zu allen Audiodateien. Da sich diese Daten, wenn überhaupt, nicht viel ändern, eignen sie sich sehr gut, um entweder in Firebase Storage oder meinem CDN zwischengespeichert zu werden. Dies kann meine Firestore-Kosten möglicherweise erheblich reduzieren.

„Firestore Data Bundles“ sind eine sehr schöne Ergänzung zu Firebase. Sie decken Ihre Anwendungsfälle derzeit möglicherweise nicht ab, können jedoch sehr hilfreich sein, wenn Ihr Service zu wachsen beginnt.