Estamos ejecutando una aplicación en Firestore y obtuvimos un disparador simple que cuando se crean o actualizan los detalles del pedido, parte de su información debe volver a escribirse en la colección de pedidos principal.
La función para esto obtuvo el siguiente código.
export const updateOrderDetails = functions .region(FUNCTION_REGION) .firestore.document("orders/{orderId}/details/pickupAndDropoff") .onWrite(async (change, context) => { return await admin .firestore() .collection("orders") .doc(context.params.orderId) .set({ pickupAndDropoff: change.after.data() }, { merge: true }); });Antes funcionaba bien, pero ahora, al azar, alrededor de cada tercio de sus ejecuciones se retrasa. A veces por unos minutos. En los registros de Cloud Function, vemos tiempos de ejecución normales <200 ms, por lo que parece que el activador se ejecuta después de una gran pausa.
Lo que es peor, de vez en cuando nuestro change.after.data() no está definido, pero nunca eliminamos nada, solo se actualiza y se crea.
Estaba funcionando bien, no cambiamos nada desde la semana pasada, pero ahora comenzó a tener retrasos inesperados. También verificamos el estado de Firebase, pero no hay fallas en el servicio de funciones de Firebase. ¿Cuál puede ser la causa de esto?
El problema puede deberse a que el orderId aumenta monótonamente como el parámetro pasado aquí:
... .collection("orders") .doc(context.params.orderId) ...Si puede verificar una vez si el ID de pedido pasado aquí aumenta monótonamente con cada solicitud. Puede conducir a puntos de acceso que afectan la latencia .
Para explicarlo, creo que la velocidad de escritura debe cambiar en diferentes días y horas, a medida que cambia el tráfico del usuario que usa la aplicación o las solicitudes de prueba de carga , lo que está creando un tipo de comportamiento inesperado. A una velocidad de escritura baja , las solicitudes funcionan como se esperaba la mayor parte del tiempo. A una velocidad de escritura alta , las solicitudes enfrentan una situación de punto de acceso en el almacén de incendios, como se menciona en la documentación del almacén de incendios, lo que genera demoras (problema de latencia).
Aquí está el enlace relevante a la documentación de mejores prácticas de firestore.
Gracias a la sugerencia de Frank van Puffelen, enviamos esta pregunta directamente al soporte de Firebase y, después de su investigación interna, recibimos la respuesta de un equipo de ingeniería de que, de hecho, se trataba de un mal funcionamiento de la infraestructura.
La respuesta que obtuve de ellos fue:
Elevé el problema para recuperar más información. Hasta ahora, parece que hubo un problema con la publicación/suscripción y la creación del evento. El equipo de Firestore también se está comunicando con el equipo de pub/sub para investigar el problema y prevenir futuros incidentes.
Parece que la mejor manera de lidiar con estos problemas es escribir rápidamente directamente al equipo de soporte de Firebase, porque como mencionaron en la respuesta automática que recibí después de enviar un ticket de soporte:
Para las interrupciones de Firebase que no aparecen en el panel de estado, responderemos dentro de las 4 horas.
que parece ser la mejor opción.