Paquetes de datos de Firestore

Una nueva implementación para documentos de Firestore almacenados en caché

Firestore acaba de mejorar

Firebase Firestore se mejoró recientemente y ahora implementa una nueva función llamada "Paquetes de datos de Firestore". El concepto central es que las consultas de Firestore ahora se pueden empaquetar en formato binario y servirse a través de su CDN u otra solución de alojamiento. Efectivamente, esto significa que un cierto grupo de sus datos podría ser adecuado para no obtenerlo directamente del backend de Firestore, sino más bien un CDN y, por lo tanto, puede ahorrarle algunos costos.

¿Pero por qué? Y más importante, ¡¿cómo ?!

Los "paquetes de datos de Firestore" tienen un diseño realmente simple:

  • primero crea una referencia de "paquete de datos" en un entorno de servidor a través del SDK de administrador
  • luego, este paquete se carga con consultas estándar de Firestore
  • lo que tiene entonces es un búfer de estos datos que se puede almacenar como un archivo, por ejemplo, o en su CDN
  • cambiando a su lado del cliente, todo lo que queda ahora es usar la nueva API de Firestore para cargar realmente el paquete desde su 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.
}

El beneficio de tal paquete de datos se vuelve más claro cuando se mira un ejemplo. Imagina que usas con frecuencia un conjunto de valores predeterminado para un nuevo documento en tu Firestore, por ejemplo, al crear un nuevo usuario. En lugar de buscar directamente en la base de datos, ahora puede usar "Paquetes de datos de Firestore" para cargar estos valores como un documento en caché de su CDN, evitando los costos asociados con una consulta de Firestore.

Por lo tanto, esta nueva función es más adecuada para los documentos que cumplen con los siguientes requisitos: los datos no cambian con frecuencia, la cantidad de documentos no es muy grande y se realizarán muchas recuperaciones de este conjunto de datos con frecuencia.

Otro ejemplo del mundo real

Como tal vez un caso de uso ideal, también puede tomar esta aplicación web progresiva como ejemplo. Todos los textos traducidos se almacenan en una instancia de Firestore, así como las referencias URL a todos los archivos de audio. Debido a que estos datos no cambian mucho, si es que cambian, son muy adecuados para almacenarse en caché en Firebase Storage o en mi CDN. Potencialmente, esto puede reducir significativamente los costos de mi Firestore.

Los "paquetes de datos de Firestore" son una muy buena adición a Firebase. Es posible que no cubran sus casos de uso por ahora, pero podrían resultar muy útiles cuando su servicio comience a crecer.