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.

Mediante el uso de Cloud Scheduler para la programación y Cloud Pub/Sub para los mensajes distribuidos, puedes compilar una aplicación a fin de programar tareas de manera confiable en una flota de instancias de Compute Engine.

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. Una vez que hayas programado un trabajo, Cloud Scheduler llamará a los controladores de eventos configurados, que pueden ser servicios de App Engine, extremos HTTP o suscripciones a Cloud 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 las instancias de Compute Engine con el uso de Cloud Pub/Sub. Este ejemplo 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 las instancias de Compute Engine mediante Cloud Pub/Sub.

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

Mediante el uso de Cloud 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 las secuencias de comandos cron según sea necesario, sin 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 de acuerdo con un programa 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 GCP si no utilizas esos recursos para otras aplicaciones. Si otras aplicaciones del proyecto utilizan las cuotas gratuitas, el uso total de los recursos de Compute Engine, Cloud Scheduler y Cloud Pub/Sub determina los costos.

Los precios de Cloud Scheduler se basan en la cantidad de trabajos programados. Los precios de Compute Engine se basan en el tipo y la duración de las instancias utilizadas. Los precios de Cloud Pub/Sub se basan en el volumen de datos enviados.

Por ejemplo, si ejecutas la implementación de muestra en la siguiente sección durante una hora y, a continuación, borras los recursos de GCP, el costo será aproximadamente 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

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

La muestra consta de dos partes:

  • Instrucciones para configurar Cloud Scheduler y Cloud Pub/Sub

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

El archivo Readme incluido con la muestra describe esa muestra con más detalle, además de cómo ejecutar el código de muestra en GCP.

Cómo compilar 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 sola instancia 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 mensajes cron diferentes a conjuntos de servidores distintos, como se ilustra en los temas A y C de Cloud Pub/Sub. Las tareas en el Tema A se envían a un solo suscriptor, mientras que varios servidores se suscriben al Tema C. Puedes utilizar esta estrategia para ejecutar un conjunto de comandos en el servidor web y otro conjunto 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 Cómo crear y configurar 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 manualmente la utilidad en Compute Engine y ejecutarla como un proceso en primer plano, puedes iniciarla automáticamente como un daemon a través de un sistema o una herramienta de terceros, como systemd o Supervisor.

  • Ni Cloud Scheduler ni Cloud Pub/Sub ofrecen garantías de entrega estrictas "exactamente una vez". Aunque es poco probable, la entrega de mensajes duplicados puede ocurrir. 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 recomendaciones de cron y asegúrate de que las tareas estén programadas lo suficientemente separadas para 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 Cloud 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 te brinda flexibilidad para completar las tareas poco después del evento, a un costo mínimo.

Prueba otras funciones de Google Cloud Platform tú mismo. Revisa nuestros instructivos.

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…