Mi aplicación tiene una tabla de clasificación que se actualiza diariamente con una función de Firebase. Ahora tengo más de 20.000 usuarios y la función se agota siempre (ya durante 550 segundos).
exports.scheduledFunction = functions.pubsub.schedule('every day 00:00').timeZone('Europe/Vienna').onRun( async (contextm) => { functions.logger.log('Positioning stated... (v.1.0.5)'); batch = db.batch(); const allUsers = await db.collection('users').orderBy('coins', 'desc').get(); let i = 0; for (const doc of allUsers.docs) { batch.update(doc.ref, "rank", i); i += 1; if(i % 499 == 0) { await batch.commit(); batch = db.batch(); } } const writeResult = await batch.commit(); functions.logger.log('Updating Leaderboard'); return null; });¿Cómo optimizar en términos de rendimiento?
No hay nada que puedas hacer para mejorar la situación en términos de rendimiento. La velocidad de ejecución de su código depende del rendimiento de Firestore. Las operaciones de Firestore siempre tardarán lo que tarden, no se pueden acelerar.
Las únicas alternativas que tienes dentro de GCP son:
Para el n.° 1, puede activar otras funciones pubsub para manejar lotes de usuarios de forma asíncrona desde la función principal. Tendrá que empaquetar una carga útil de datos para que funcione la función de delegado, de modo que no tenga que repetir la primera consulta. Cada invocación de delegado puede actualizar los documentos en su propia cantidad de tiempo más predecible (ya que limitará el tamaño de cada lote).
Para el n.° 2, podría usar Cloud Run, que le brinda hasta 60 minutos de tiempo por invocación. O podría configurar una instancia de Compute Engine, que se ejecutaría las 24 horas del día, los 7 días de la semana, y escribiría código para invocar un punto final expuesto en su función programada.
Si maximizó sus opciones de tiempo de ejecución a 540 segundos y 8 GB de memoria, su única solución (puedo recomendarla) sería ejecutar ese código en un backend confiable con el SDK de administrador de Firebase. Así es como recalculamos todos los días nuestras existencias en almacén. Tarda unos 30 minutos, por lo que no se puede ejecutar en una función de nube de Firebase.