Ensembles de données Firestore

Une nouvelle implémentation pour les documents Firestore mis en cache

Firestore vient de s'améliorer

Firebase Firestore a récemment été amélioré et implémente désormais une nouvelle fonctionnalité appelée "Firestore Data Bundles". Le concept de base est que les requêtes Firestore peuvent désormais être empaquetées au format binaire et servies via votre CDN ou une autre solution d'hébergement. En fait, cela signifie qu'un certain groupe de vos données peut être bien adapté pour ne pas être récupéré directement depuis le backend Firestore, mais plutôt un CDN et peut donc vous faire économiser des coûts.

Mais pourquoi? Et plus important, comment ?!

Les « bundles de données Firestore » sont en fait très simples :

  • vous créez d'abord une référence "data bundle" dans un environnement de serveur via le SDK Admin
  • ensuite, cet ensemble est chargé avec des requêtes Firestore standard
  • ce que vous avez alors est un tampon de ces données qui peut être stocké sous forme de fichier, par exemple, ou dans votre CDN
  • en passant du côté client, il ne vous reste plus qu'à utiliser la nouvelle API Firestore pour charger réellement le bundle à partir de votre 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.
}

L'avantage d'un tel paquet de données devient plus clair lorsqu'on regarde un exemple. Imaginez que vous utilisiez fréquemment un ensemble de valeurs par défaut pour un nouveau document dans votre Firestore, par exemple lors de la création d'un nouvel utilisateur. Au lieu d'aller chercher directement à partir de la base de données, vous pouvez désormais utiliser des « ensembles de données Firestore » pour charger ces valeurs en tant que document mis en cache à partir de votre CDN, évitant ainsi les coûts associés à une requête Firestore.

Cette nouvelle fonctionnalité est donc mieux adaptée aux documents qui se conforment aux exigences suivantes : les données ne changent pas souvent, le nombre de documents n'est pas très important et de nombreuses extractions pour cet ensemble de données se produisent fréquemment.

Un autre exemple du monde réel

Comme peut-être un cas d'utilisation idéal, vous pouvez également prendre cette application Web progressive comme exemple. Tous les textes traduits sont stockés dans une instance Firestore, ainsi que les références URL à tous les fichiers audio. Parce que ces données ne changent pas beaucoup, voire pas du tout, elles sont très bien adaptées pour être mises en cache dans Firebase Storage ou mon CDN. Cela peut potentiellement réduire considérablement les coûts de mon Firestore.

Les "Firestore Data Bundles" sont un très bon ajout à Firebase. Ils pourraient ne pas couvrir vos cas d'utilisation pour le moment, mais pourraient devenir très utiles lorsque votre service commencera à se développer.