Práticas recomendadas para novas tentativas e pontos de verificação de tarefas

As tarefas de trabalho individuais ou até mesmo as execuções de trabalhos podem falhar por vários motivos. Esta página contém práticas recomendadas para lidar com estas falhas, centradas nos reinícios de tarefas e na criação de pontos de verificação de trabalhos.

Use novas tentativas de tarefas

As tarefas individuais podem falhar por vários motivos, incluindo problemas com dependências de aplicações, quotas ou até eventos internos do sistema. Muitas vezes, estes problemas são temporários e a tarefa é concluída com êxito após uma nova tentativa.

Por predefinição, cada tarefa é repetida automaticamente até 3 vezes. Isto ajuda a garantir que um trabalho é executado até à conclusão, mesmo que encontre falhas de tarefas transitórias. Também pode personalizar o número máximo de novas tentativas. No entanto, se alterar a predefinição, deve especificar, pelo menos, uma nova tentativa.

Planeie os reinícios das tarefas de trabalho

Torne os seus trabalhos idempotentes, para que um reinício da tarefa não resulte num resultado danificado ou duplicado. Ou seja, escreva uma lógica repetível que tenha o mesmo comportamento para um determinado conjunto de entradas, independentemente do número de vezes que é repetida ou quando é executada.

Escrever o resultado num local diferente do dos dados de entrada, deixando os dados de entrada intactos. Desta forma, se a tarefa for executada novamente, pode repetir o processo desde o início e obter o mesmo resultado.

Evite duplicar dados de saída reutilizando o mesmo identificador único ou verificando se a saída já existe. Os dados duplicados representam uma corrupção de dados ao nível da recolha.

Use a criação de pontos de verificação

Sempre que possível, crie pontos de verificação para as suas tarefas. Deste modo, se uma tarefa for reiniciada após uma falha, pode continuar a partir do ponto em que ficou, em vez de reiniciar o trabalho desde o início. Esta ação acelera as tarefas e minimiza os custos desnecessários.

Escreva periodicamente resultados parciais e uma indicação do progresso realizado numa localização de armazenamento persistente, como o Cloud Storage ou uma base de dados. Quando a tarefa começar, procure resultados parciais no arranque. Se forem encontrados resultados parciais, o processamento é iniciado a partir do ponto em que foi interrompido.

Se o seu trabalho não se adequar à criação de pontos de verificação, pondere dividi-lo em partes mais pequenas e executar um número maior de tarefas.

Exemplo de ponto de verificação 1: calcular Pi

Se tiver um trabalho que execute um algoritmo recursivo, como calcular o Pi com muitas casas decimais, e usar o paralelismo definido para um valor de 1:

  • Escreva o seu progresso a cada 10 minutos ou o que a sua tolerância de trabalho perdido permitir, num pi-progress.txtobjeto do Cloud Storage.
  • Quando uma tarefa é iniciada, consulte o objeto pi-progress.txt e carregue o valor como um local de início. Use esse valor como a entrada inicial para a sua função.
  • Escreva o resultado final no Cloud Storage como um objeto denominado pi-complete.txt para evitar a duplicação através da execução paralela ou repetida ou pi-complete-DATE.txt para diferenciar por data de conclusão.

Exemplo de criação de pontos de verificação 2: processamento de 10 000 registos do Cloud SQL

Se tiver um trabalho a processar 10 000 registos numa base de dados relacional,como o Cloud SQL:

  • Apresente registos a serem processados com uma consulta SQL, como SELECT * FROM example_table LIMIT 10000
  • Escreva registos atualizados em lotes de 100 para que o trabalho de processamento significativo não seja perdido em caso de interrupção.
  • Quando os registos são escritos, tome nota dos que foram processados. Pode adicionar uma coluna booleana processada à tabela, que é definida como 1 apenas se o processamento for confirmado.
  • Quando uma tarefa é iniciada, a consulta usada para obter itens para processamento deve adicionar a condição processed = 0.
  • Além das novas tentativas limpas, esta técnica também suporta a divisão do trabalho em tarefas mais pequenas, como modificar a sua consulta para selecionar 100 registos de cada vez: LIMIT 100 OFFSET $CLOUD_RUN_TASK_INDEX*100 e executar 100 tarefas para processar todos os 10 000 registos. CLOUD_RUN_TASK_INDEX é uma variável de ambiente incorporada presente no contentor que executa tarefas do Cloud Run.

Usando todas estas partes em conjunto, a consulta final pode ser semelhante a esta: SELECT * FROM example_table WHERE processed = 0 LIMIT 100 OFFSET $CLOUD_RUN_TASK_INDEX*100

O que se segue?