¿Cómo puedo saber si mis datos en Firestore vienen del servidor o de la caché?

Publicado el 07.07.2024 a las 22:47

¿Cómo puedo saber si mis datos en Firestore vienen del servidor o de la caché?

  1. Metadata en Firestore

  2. Código para obtener el origen de datos en Firestore

¿Cómo puedo saber si mis datos en Firestore vienen del servidor o de la caché?

Los problemas nunca vienen solos.


Ayer gané 7 canas más.


Tengo una aplicación para hostelería que envía comandas a distintas impresoras dependiendo de si son bebidas, platos de horno, de cocina...


Uso Firestore como base de datos y para disminuir el tráfico tengo activado el caché.


Si quieres saber cómo hacerlo escribí un artículo hace tiempo.


Te lo dejo aquí

Imagen del artículo

Cachea Firestore 🔥 y baja los costes 💸 disparando el rendimiento ✅

Si usas Firestore como base de datos vas a disminuir muchísimas lecturas de documentos del servidor ahorrando mucho dinero y aumentando el rendimiento de tu APP


Venga, al turrón...


Este viernes me llaman de un negocio donde tienen mi aplicación y me dicen que la impresora de cocina no imprime.


Ayer sábado por la mañana me llego y el Bluetooth de la impresora no respondía.


La desmonté y me la llevé.


Compré un cable activo USB de 10 metros, lo probé en casa y funcionaba.


Hoy por la mañana me acerco a montar la impresora con el cable y... sorpresa...


Me dicen que al llevarme la impresora las comandas se imprimen por duplicado en el resto de impresoras...


Cago en tó...


Dejo la impresora montada y funcionando y me llevo como deberes para casa ver qué pasa.


Vaya siesta que he echado, después de 2 horas encontré el problema.


El tema es que al no tener la impresora de cocina, estaban haciendo las comandas en el ordenador que he configurado como servidor, el de la barra.


Al hacer las comandas con el servidor se estaba imprimiendo por duplicado porque detectaba como comandas nuevas la que se guardaba en caché y después la actualización en la nube.


A ver, te explico un poco más.


Uso el patrón de diseño observador para vigilar las nuevas comandas que se hacen con los móviles y cuando se suben a la nube las detecto y las mando a imprimir desde el servidor.


Al hacerlo con un dispositivo distinto al servidor (ordenador de la barra) no había problema.


Pero al hacerlo desde el servidor, como uso caché como ya te comenté al principio pues mi código detectaba como nueva comanda la que guardaba en la caché y como milisegundos después se actualizaba con la nube pues ahí tenías la segunda copia.


No sé si te ha quedado claro, pero es tarde para seguir intentado explicarlo mejor.


Si te quedan dudas y quieres despejarlas me preguntas.


En el artículo de hoy te voy a decir cómo saber si tus datos en Firestore pertenecen a la caché o a la nube.

Metadata en Firestore

Firestore es una base de datos NoSQL que ofrece sincronización en tiempo real y almacenamiento offline.


Una de las mejors características y a veces confusas de Firestore es su capacidad para manejar datos en caché y del servidor.


Cada documento en Firestore viene con metadata que te permite saber si los datos han sido obtenidos del caché local o directamente del servidor.


Esta información es crucial, especialmente en aplicaciones que requieren alta disponibilidad y precisión, como en este caso, donde cada comanda cuenta para evitar lios en la cocina.


Ahora con el verano están las terrazas a tope.

Código para obtener el origen de datos en Firestore

Usando el método snapshotChanges en lugar de valueChanges en tus subscripciones a observables, puedes obtener una vista más detallada de los documentos, incluyendo los metadata.


this.firestore.collection('comandas').snapshotChanges().pipe(
  map(actions => actions.map(a => {
    const data = a.payload.doc.data() as Comanda;
    const id = a.payload.doc.id;
    const metadata = a.payload.doc.metadata;
    return { id, data, metadata };
  }))
).subscribe(data => {
  this.comandas = data;
});
      

En el código anterior, cada documento comanda incluye sus datos y metadata.


Puedes ver fácilmente si los datos provienen del caché (fromCache: true) o del servidor (fromCache: false).


Hasta luego 🖖