Estoy agregando tareas como Documentos en una colección de Firestore. En el backend, tengo varias instancias sin estado de NodeJs que procesan estas tareas. Todas las instancias están escuchando cambios en tiempo real en la colección.
firestore().collection('Tasks').onSnapshot(startTask, onError);En este caso, se notificará a todas las instancias de NodeJs cuando se agregue una tarea. ¿Cómo puedo asegurarme de que solo uno de ellos procese la tarea? Pensé en usar firebase-queue pero parece que el proyecto está obsoleto. ¿Hay alguna manera de hacerlo sin módulos adicionales? Ejecutar la función NodeJs como Firebase no es una opción para mí.
Una posible solución sería agregar un indicador "tratado" al documento de Firestore a través de una Transacción .
Una instancia determinada de Node.js solo debe procesar esta tarea si no está marcada como tratada (por ejemplo, comprueba al comienzo de la transacción si el campo treated está establecido en true y, en ese caso, arroja un error; consulte los ejemplos). ). Y después de haberlo procesado con éxito, la instancia de Node.js marcará el documento como tratado (dentro de la misma Transacción, por supuesto).
Dado que usa un servidor Node.js (es decir, usa la biblioteca de cliente del servidor Node.js), la transacción coloca un bloqueo en el documento de tarea que está leyendo y, por lo tanto, las otras instancias no pueden modificar el documento. De esta manera, está seguro de que será tratado solo una vez.
Más detalles sobre la contención de datos en las bibliotecas del cliente del servidor aquí en el documento.