Estoy usando una función en la nube extremadamente simple para (intentar) mantener mi base de datos en tiempo real sincronizada con Firestore.
exports.copyDocument = functions.database.ref('/invoices/{companyId}/{documentId}') .onWrite((change, context) => { if (!change.after.exists()) { return null; } return admin.firestore().collection('companies').doc(context.params.companyId).collection('invoices') .doc(context.params.documentId) .set(change.after.val()); });Desafortunadamente, veo problemas en los que, a veces, el documento de Cloud Firestore no tiene la copia más reciente de los datos de la base de datos en tiempo real. Es poco frecuente, pero no obstante afecta a mis usuarios finales.
¿Por qué está pasando esto?
Dos ideas que tuve fueron -
Es posible que Firestore no esté disponible para escribir en Cloud Function, y no tengo habilitados los reintentos en mi Cloud Function, por lo que podría estar fallando. Habilitar los reintentos resolverá mi problema. Sin embargo, tengo absolutamente 0 registros de error de que esto suceda.
El usuario hace el cambio A, luego el usuario hace el cambio B 2-3 segundos después. En este caso, es posible, supongo, que el disparador de Cloud Function para el cambio A no se haya ejecutado, pero el disparador para el cambio B se ejecuta rápidamente, luego el disparador del cambio A se ejecuta y copia los datos 'obsoletos'. Los posibles remedios serían obtener la última versión nuevamente de la base de datos en tiempo real en mi Cloud Function (no es lo ideal, es bueno usar change.after.val() ), o tal vez mantener algún número entero incremental en mi documento, y en su lugar copiarlo en el Firestore usa una transacción que compara versiones en lugar de un simple set() .
El único mensaje de error que veo en mis registros de errores de Cloud Function es:
La solicitud se anuló porque no había ninguna instancia disponible. Puede encontrar documentación adicional para la solución de problemas en: https://cloud.google.com/functions/docs/troubleshooting#scalability
Pero esos documentos indican que este error siempre se vuelve a intentar, incluso sin habilitar explícitamente los reintentos de funciones.
Me inclino por el problema 1: Firestore solo emite un parpadeo a veces, los reintentos no están habilitados y no estoy registrando la promesa fallida correctamente. Si este es el caso, ¿cómo puedo solucionar este registro?