Pacchetti di dati Firestore

Una nuova implementazione per i documenti Firestore memorizzati nella cache

Firestore è appena migliorato

Firebase Firestore è stato recentemente migliorato e ora implementa una nuova funzionalità chiamata "Firestore Data Bundles". Il concetto fondamentale è che le query Firestore possono ora essere impacchettate in formato binario e servite tramite il CDN o un'altra soluzione di hosting. In effetti, questo significa che un determinato gruppo di dati potrebbe essere adatto a non essere recuperato direttamente dal backend Firestore, ma piuttosto da un CDN e quindi può farti risparmiare sui costi.

Ma perché? E, cosa più importante, come?!

I "pacchetti di dati Firestore" sono in realtà progettati in modo molto semplice:

  • per prima cosa crei un riferimento "fascio di dati" in un ambiente server tramite Admin SDKAdmin
  • quindi, questo pacchetto viene caricato con le query standard di Firestore
  • quello che hai quindi è un buffer di questi dati che può essere archiviato come file, ad esempio, o nel tuo CDN
  • passando al lato client, tutto ciò che resta ora utilizzando la nuova API Firestore per caricare effettivamente il bundle dal tuo 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.
}

Il vantaggio di un tale pacchetto di dati diventa più chiaro quando si osserva un esempio. Immagina di utilizzare frequentemente un set di valori predefinito per un nuovo documento nel tuo Firestore, ad esempio quando crei un nuovo utente. Invece di recuperare direttamente dal database, ora puoi utilizzare "Firestore Data Bundles" per caricare questi valori come documento memorizzato nella cache dalla tua CDN, evitando i costi associati a una query Firestore.

Questa nuova funzionalità è quindi più adatta per i documenti che soddisfano i seguenti requisiti: i dati non cambiano spesso, il numero di documenti non è molto grande e si verificano spesso molti recuperi per questo set di dati.

Un altro esempio del mondo reale

Come caso d'uso ideale, puoi anche prendere questa web app progressiva come esempio. Tutti i testi tradotti vengono archiviati in un'istanza Firestore, così come i riferimenti URL a tutti i file audio. Poiché questi dati non cambiano molto, se non del tutto, sono molto adatti per essere memorizzati nella cache in Firebase Storage o nel mio CDN. Ciò può potenzialmente ridurre significativamente i costi del mio Firestore.

I "Firestore Data Bundles" sono un'aggiunta molto interessante a Firebase. Potrebbero non coprire i tuoi casi d'uso per ora, ma potrebbero diventare molto utili quando il tuo servizio inizia a crescere.