Programação confiável de tarefas no Compute Engine com o Cloud Scheduler

Em sistemas distribuídos, como uma rede de instâncias do Compute Engine, é difícil programar tarefas de maneira confiável, porque qualquer instância individual pode ficar indisponível devido a escalonamento automático ou particionamento de rede.

Ao usar o Cloud Scheduler para programação e o Pub/Sub para mensagens distribuídas, é possível criar um aplicativo para programar tarefas de maneira confiável em uma frota de instâncias do Compute Engine. Se você precisar programar e orquestrar fluxos de trabalho complexos em outros produtos ou nuvens, use o Cloud Composer.

Neste artigo de três partes, são abordados os seguintes itens:

Como programar tarefas de maneira confiável no Compute Engine

Cron é a ferramenta padrão para programar tarefas recorrentes nos sistemas Unix. Conforme os sistemas criados aumentam de complexidade e se tornam distribuídos, ter apenas um computador executando o cron pode se tornar um ponto de falha crítico. A instância pode parar devido ao escalonamento automático, ou o segmento de rede pode ser particionado dos sistemas com os quais ela precisa se comunicar.

O Cloud Scheduler fornece um serviço de nível empresarial totalmente gerenciado que permite programar eventos. Depois de programar um job, o Cloud Scheduler chamará os manipuladores de eventos configurados, que podem ser serviços do App Engine, endpoints HTTP ou assinaturas do Pub/Sub.

Para executar tarefas na instância do Compute Engine em resposta a eventos do Cloud Scheduler, é necessário redirecionar os eventos para essas instâncias. Uma maneira de fazer isso é chamar um endpoint HTTP executado nas instâncias do Compute Engine. Outra opção é passar mensagens do Cloud Scheduler para as instâncias do Compute Engine usando o Pub/Sub. Neste exemplo, ilustramos o segundo padrão de design.

Veja um panorama da arquitetura desse padrão de design no diagrama a seguir.

Diagrama de visão geral da arquitetura

Nesta implementação, você programa eventos no Cloud Scheduler e, em seguida, transmite-os para instâncias do Compute Engine usando o Pub/Sub.

Um serviço utilitário nas instâncias do Compute Engine se inscreve em tópicos do Pub/Sub e executa cron jobs em resposta aos eventos que ele extrai desses tópicos. O utilitário executa scripts padrão, portanto, não é necessário modificar os scripts cron atuais para usá-los neste exemplo.

Ao usar o Pub/Sub para separar a lógica de programação de tarefas da lógica que executa os comandos no Compute Engine, é possível atualizar seus scripts cron conforme necessário, sem atualizar a configuração do Cloud Scheduler. Também é possível alterar a programação de tarefas sem atualizar o serviço utilitário nas instâncias do Compute Engine.

Cotas

Como os cron jobs normalmente são poucos e executados em uma programação horária, semanal ou diária, esse padrão de design não deve exceder as cotas do Cloud Scheduler, que permitem dezenas de solicitações por minuto e milhares por dia. Caso isso aconteça, use outros padrões de aplicativo, como gerenciar a cronologia das tarefas diretamente no código do aplicativo.

Custo

É possível testar a implementação de amostra desse padrão de design sem custo com o nível gratuito do Google Cloud, caso você não esteja usando esses recursos para outros aplicativos. Se as cotas gratuitas forem usadas por outros aplicativos no projeto, os custos serão determinados pelo uso total dos recursos do Compute Engine, do Cloud Scheduler e do Pub/Sub.

Os preços do Cloud Scheduler são baseados no número de jobs programados. Os preços do Compute Engine são baseados no tipo e na duração das instâncias usadas. Os preços do Pub/Sub são baseados no volume de dados enviados.

Por exemplo, se você executar a implementação de exemplo na seção a seguir por uma hora e depois excluir os recursos do Google Cloud, o custo será de aproximadamente US$ 0,01. Para uma análise detalhada dos custos nessa estimativa e para calcular os custos do seu próprio caso de uso, consulte a calculadora de preços.

Exemplo de implementação do padrão de design

Um exemplo de implementação desse padrão de design, Exemplo: programação de tarefas confiável no Compute Engine (em inglês), está disponível no GitHub.

O exemplo consiste em duas partes:

  • Instruções para configurar o Cloud Scheduler e o Pub/Sub.

  • Um utilitário executado no Compute Engine. Esse utilitário monitora um tópico do Pub/Sub. Ao detectar uma nova mensagem, ele executa o comando correspondente localmente no servidor.

O arquivo readme, incluído no exemplo, descreve o exemplo em mais detalhes e como executar o código de amostra no Google Cloud.

Como criar com base no padrão de design e na amostra

No exemplo, ilustramos uma maneira de implementar uma solução de programação confiável para o Compute Engine usando o Cloud Scheduler. Esse padrão de design é útil porque, nele, a lógica de programação fica separada da lógica que executa os comandos na instância do Compute Engine, o que possibilita a mudança de local e execução das tarefas sem precisar atualizar a lógica de programação.

Veja o fluxo de mensagens deste exemplo no diagrama a seguir. Ao especificar quais instâncias se inscrevem em um tópico, é possível controlar a execução de um cron job em uma ou em várias instâncias.

Diagrama de arquitetura detalhado

Outra vantagem dessa arquitetura é o controle sobre a maneira como os cron jobs são roteados para suas instâncias.

É possível enviar mensagens cron diferentes para diferentes conjuntos de servidores, conforme ilustrado pelos tópicos A e C do Pub/Sub. As tarefas no tópico A são enviadas para um único inscrito, enquanto vários servidores se inscrevem no tópico C. Você usa essa estratégia para executar um conjunto de comandos no servidor da Web e outro conjunto nos outros servidores.

Outra opção é executar um comando em um dos vários servidores. Isso é ilustrado pelo tópico B. Nesse caso, vários servidores compartilham uma única inscrição. As mensagens publicadas no tópico B são manipuladas pelo primeiro servidor para reivindicar essa mensagem, e o comando correspondente só é executado nesse servidor. É possível usar essa abordagem para realizar análises de dados noturnas que precisam ser executadas em apenas um servidor.

A seguir

Modifique o exemplo e use-o como modelo para seu próprio aplicativo. Veja abaixo algumas ideias para você começar.

  • Atualize a configuração do Cloud Scheduler para especificar suas próprias mensagens cron. É possível atualizar o cron job diretamente, conforme descrito em Como criar e configurar cron jobs.

  • Atualize test_executor.py para executar um script real em vez de logger_sample_task.py ou escreva seu próprio utilitário Executor.

  • Em vez de iniciar manualmente o utilitário no Compute Engine e executá-lo como um processo em primeiro plano, é possível iniciá-lo automaticamente como um daemon por um sistema ou ferramenta de terceiros, como systemd ou Supervisor (em inglês).

  • O Cloud Scheduler e o Pub/Sub não oferecem garantias estritas de entrega "exatamente uma vez". Pode acontecer uma entrega de mensagem duplicada, mas isso é improvável. Se a execução de uma tarefa específica mais de uma vez gerar um resultado indesejado, use uma ferramenta distribuída de bloqueio consistente, como o Zookeeper (em inglês), para garantir que a tarefa seja executada somente uma vez e por apenas uma instância.

  • Ao programar tarefas, siga as práticas recomendadas do cron e programe-as distantes o bastante para que possam ser processadas completamente antes de serem executadas outra vez.

  • Avalie se a execução de instâncias do Compute Engine é necessária para todas as tarefas. Uma alternativa é acionar o Cloud Functions em resposta a mensagens do Pub/Sub. O Cloud Functions pode chamar APIs do Cloud, mas não pode executar scripts de shell diretamente. Se você precisar executar scripts de shell, chame a API Compute Engine para criar instâncias temporárias do Compute Engine que executem scripts. Essas instâncias podem simplesmente se desligar quando as tarefas forem concluídas. Isso dá a você flexibilidade para completar as tarefas pouco tempo depois do tempo do evento, com um custo mínimo.

Explore arquiteturas de referência, diagramas, tutoriais e práticas recomendadas sobre o Google Cloud. Dê uma olhada no Cloud Architecture Center.