es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo activar un proceso de ejecución prolongada en la nube sin demora?

¿Cuál es la mejor manera de activar tareas de larga duración (hasta media hora) en Cloud Run sin retrasos? ¿Si esto no es confiable actualmente, existen otras herramientas sin servidor en GCP que se puedan utilizar para ejecutar tareas de larga duración?

Detalles:

Tenemos la siguiente configuración:

  • Aplicación de backend en contenedores implementada en Cloud Run.
  • La aplicación consta de dos partes llamadas App scheduler y Worker.
  • App scheduler es activado por Google Cloud Scheduler cada 5 minutos.
  • Cuando se ejecuta, App scheduler identifica cuántos Workers se deben ejecutar y los activa.
  • A veces no es necesario ejecutar ningún trabajador, otras veces hay cientos de Workers. Cada Worker tarda entre 1 y 30 minutos en completar su tarea.

Ahora, hemos intentado los siguientes métodos para activar los trabajadores (como se recomienda en la documentación de Cloud Run: https://cloud.google.com/run/docs/authenticating/service-to-service):

  • Google Cloud Tasks
  • PubSub

Estos métodos resultan en un retraso muy largo entre la activación de App Scheduler que empuja un mensaje a Cloud Task o PubSub y la activación de Worker. Estos retrasos pueden durar hasta 30 minutos.

Después de investigar, descubrí que esto se debe a que el Worker toma mucho tiempo para ejecutarse y el servicio de Cloud Run no responde con 200 hasta que el Worker haya terminado. Estos retrasos son aplicados a las invocaciones de Cloud Tasks y PubSub de los trabajadores.

Pude cambiar este comportamiento ejecutando algunos “trabajadores falsos” que corren muy rápidamente. Es decir, por cada trabajador real, empuje 20 trabajadores falsos/rápidos y todo funciona como se espera.

Otra solución que encontré fue activar Worker directamente desde App Scheduler como se describe en la documentación de Cloud Run anterior para activaciones sincrónicas especificando el tiempo de espera de solicitud. De esta manera, pude activar varios trabajadores de forma asíncrona.

También intenté solucionar esto aumentando el número de CPU y asegurándome de que al menos 1 instancia de Cloud Run siempre esté disponible, pero sin suerte.

Estos soluciones alternativas no parecen confiables para mí. Por lo tanto, estoy buscando una solución mejor.

Otro problema conectado a este es que a veces, cuando Google Cloud Scheduler activa App Scheduler, no se activa con el siguiente error en Google Cloud Scheduler:

{"@type":"type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished", "jobName":"projects/[OMITTED PROJECT]/locations/europe-west1/jobs/[OMITTED SERVICE NAME]", "status":"UNKNOWN", "targetType":"HTTP", "url":"https://[OMITTED SERVICE URL]"}

Esto suele coincidir con la ejecución de un Worker de larga duración.

Me pregunto cuáles son las mejores formas de ejecutar servicios de Cloud Run de larga duración de manera confiable.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La mejor manera de activar tareas de larga duración en Cloud Run sin retraso es utilizar desencadenadores directos y síncronos desde el Programador de aplicaciones, como se describe en la documentación de Cloud Run. Esto le permite activar varios trabajadores de forma asíncrona y especificar un tiempo de espera de solicitud. Otras herramientas sin servidor en GCP que se pueden utilizar para ejecutar tareas de larga duración incluyen Google Cloud Functions y Google Cloud Tasks. Sin embargo, estos métodos también pueden generar retrasos debido a la naturaleza de larga duración de las tareas. Las soluciones alternativas, como la ejecución de trabajadores falsos rápidos o el aumento del número de CPU, no son soluciones confiables.

Comments are closed.