Programación confiable de tareas en Compute Engine con Cloud Scheduler

En los sistemas distribuidos, como una red de instancias de Compute Engine, es un desafío programar tareas de manera confiable, ya que es posible que una instancia individual no esté disponible debido al ajuste de escala automático o la partición de red.

Si usas Cloud Scheduler para programar y Pub/Sub para enviar mensajes distribuidos, puedes compilar una aplicación a fin de programar de manera confiable tareas en una flota de instancias de Compute Engine. Si necesitas programar y organizar flujos de trabajo complejos en otros productos o nubes, considera usar Cloud Composer en su lugar.

Este artículo de tres partes incluye lo que se indica a continuación:

Cómo programar tareas de forma confiable en Compute Engine

Cron es la herramienta estándar para programar tareas recurrentes en sistemas Unix. A medida que los sistemas que compilas aumentan en complejidad y se distribuyen, una sola computadora que ejecute cron puede convertirse en un punto crítico de falla. La instancia puede detenerse debido al ajuste de escala automático, o su segmento de red podría separarse de los sistemas con los que necesita comunicarse.

Cloud Scheduler proporciona un servicio de nivel empresarial completamente administrado que te permite programar eventos. Después de programar un trabajo, Cloud Scheduler llamará a los controladores de eventos configurados, que pueden ser servicios de App Engine, extremos HTTP o suscripciones a Pub/Sub.

Para ejecutar tareas en la instancia de Compute Engine en respuesta a los eventos de Cloud Scheduler, debes retransmitir los eventos a esas instancias. Una forma de hacerlo es llamar a un extremo HTTP que se ejecuta en las instancias de Compute Engine. Otra opción es pasar mensajes de Cloud Scheduler a tus instancias de Compute Engine mediante Pub/Sub. En este ejemplo, se ilustra el segundo patrón de diseño.

En el siguiente diagrama, se proporciona una descripción general de la arquitectura de este patrón de diseño.

Diagrama de la descripción general de la arquitectura

En esta implementación, programas eventos en Cloud Scheduler y, luego, los transmites a instancias de Compute Engine mediante Pub/Sub.

Un servicio de utilidades en las instancias de Compute Engine se suscribe a temas de Pub/Sub y ejecuta trabajos cron en respuesta a los eventos que extrae de esos temas. La utilidad ejecuta las secuencias de comandos estándares, no es necesario que modifiques las secuencias de comandos cron actuales para utilizarlas en esta muestra.

Si usas Pub/Sub para separar la lógica de programación de tareas de la lógica que ejecuta los comandos en Compute Engine, puedes actualizar tus secuencias de comandos cron, según sea necesario, sin tener que actualizar la configuración de Cloud Scheduler. También puedes cambiar el programa de tareas sin actualizar el servicio de utilidad en las instancias de Compute Engine.

Cuotas

Debido a que los trabajos cron generalmente son escasos y se ejecutan por hora, semana o día, este patrón de diseño no debe exceder las cuotas de Cloud Scheduler, que permiten decenas de solicitudes por minuto y miles por día. Si es así, considera otros patrones de aplicación, como administrar el tiempo de las tareas directamente en el código de la aplicación.

Costo

Puedes probar la implementación de muestra de este patrón de diseño sin costo con el nivel gratuito de Google Cloud si no usas esos recursos para otras aplicaciones. Si otras aplicaciones de tu proyecto usan las cuotas gratuitas, los costos se determinarán según el uso total de los recursos de Compute Engine, Cloud Scheduler y Pub/Sub.

Los precios de Cloud Scheduler se basan en la cantidad de trabajos que se programen. Los precios de Compute Engine se basan en el tipo y la duración de las instancias que se usen. Los precios de Pub/Sub se basan en el volumen de datos que se envíen.

Por ejemplo, si ejecutas la implementación de muestra en la siguiente sección durante una hora y, luego, borras los recursos de Google Cloud, el costo será de alrededor de 1 centavo. Para obtener un desglose de los costos en esta estimación y para calcular los costos relativos a tu caso práctico, consulta la calculadora de precios.

Implementación de muestra del patrón de diseño

Puedes ver una implementación de muestra de este patrón de diseño, Muestra: programación confiable de tareas en Compute Engine, que está disponible en GitHub.

La muestra consta de dos partes:

  • Instrucciones para configurar Cloud Scheduler y Pub/Sub.

  • Una utilidad que se ejecuta en Compute Engine. Esta utilidad supervisa un tema de Pub/Sub. Cuando detecta un mensaje nuevo, ejecuta el comando correspondiente de manera local en el servidor.

En el archivo readme que se incluye en la muestra, se describe la muestra con más detalle y, además, se explica cómo ejecutar el código de muestra en Google Cloud.

Para el caso específico de iniciar y detener instancias en un programa, consulta Programa instancias de procesamiento con Cloud Scheduler.

Compila según el patrón de diseño y la muestra

En la muestra, se ilustra una forma de implementar una solución de programación confiable para Compute Engine con el uso de Cloud Scheduler. Es un patrón de diseño útil, porque separa la lógica de programación de la lógica que ejecuta los comandos en la instancia de Compute Engine, lo que hace posible cambiar la ubicación y la ejecución de las tareas sin tener que actualizar la lógica de programación.

En el siguiente diagrama, se muestra el flujo de mensajes en esta muestra. Cuando se especifica qué instancias se suscriben a un tema determinado, puedes controlar si un trabajo cron se ejecuta en una o en varias instancias.

Diagrama detallado de la arquitectura

Otra ventaja de esta arquitectura es el control que te otorga sobre cómo se enrutan los trabajos cron a las instancias.

Puedes enviar diferentes mensajes cron a diferentes conjuntos de servidores, como se ilustra en los temas A y C de Pub/Sub. Las tareas del tema A se envían a un solo suscriptor, mientras que varios servidores se suscriben al tema C. Puedes usar esta estrategia para ejecutar un conjunto de comandos en el servidor web y otro en los demás servidores.

Otra opción es ejecutar un comando en uno de varios servidores. Esto se ilustra en el tema B. En este caso, varios servidores comparten una sola suscripción. Los mensajes publicados en el tema B se manejan a través del primer servidor que reclama ese mensaje, y el comando correspondiente se ejecuta solo en ese servidor. Puedes usar este enfoque para realizar análisis de datos nocturnos que deben ejecutarse en un solo servidor.

¿Qué sigue?

Puedes modificar la muestra y utilizarla como modelo para tu propia aplicación. A continuación, se presentan algunas ideas para comenzar.

  • Actualiza la configuración de Cloud Scheduler para especificar tus propios mensajes cron. Puedes actualizar el trabajo cron directamente, como se describe en Crea y configura trabajos cron.

  • Actualiza test_executor.py para ejecutar una secuencia de comandos real en lugar de logger_sample_task.py o escribe tu propia utilidad Executor.

  • En lugar de iniciar la utilidad en Compute Engine de forma manual y ejecutarla como un proceso en primer plano, puedes iniciarla de forma automática como un daemon mediante un sistema o una herramienta de terceros, como systemd o Supervisor.

  • Ni Cloud Scheduler ni Pub/Sub ofrecen garantías de entrega estrictas “solo una vez”. Aunque es poco probable, la entrega de mensajes duplicados puede darse. Si la ejecución de una tarea específica más de una vez crea un resultado no deseado, utiliza una herramienta de bloqueo coherente distribuida, como Zookeeper, a fin de garantizar que la tarea se ejecute solo una vez y solo a través de una instancia.

  • Cuando programes tareas, sigue las prácticas recomendadas de cron y asegúrate de que las tareas se programen con un tiempo de separación suficiente entre ellas de manera que puedan completar el procesamiento antes de la próxima vez que se ejecuten.

  • Considera si es necesario ejecutar las instancias de Compute Engine para todas las tareas. Una alternativa es activar Cloud Functions en respuesta a los mensajes de Pub/Sub. Cloud Functions puede llamar a las API de Cloud, pero no puede ejecutar las secuencias de comandos de shell directamente. Si necesitas ejecutar las secuencias de comandos de shell, puedes llamar a la API de Compute Engine para crear instancias temporales de Compute Engine a fin de ejecutar las secuencias de comandos. Estas instancias pueden cerrarse cuando terminan las tareas. Esto brinda flexibilidad para completar las tareas poco después del evento, a un costo mínimo.

Revisa nuestros instructivos y prueba otras funciones de Google Cloud.