Automatizar novas tentativas de tarefas

Esta página descreve como repetir tarefas automaticamente após todas ou algumas falhas.

Um job do Batch falha quando pelo menos uma das tarefas falha, o que pode acontecer por vários motivos. Por padrão, cada tarefa em um job é executada apenas uma vez. Se uma tarefa falhar, ela não será repetida. No entanto, alguns problemas que causam falha em uma tarefa podem ser resolvidos facilmente apenas tentando de novo. Nesses casos, configurar o job para repetir tarefas automaticamente pode ajudar bastante a reduzir o atrito na solução de problemas e o tempo geral de execução dos jobs.

As novas tentativas automáticas são adequadas para tarefas com acoplamento flexível (independentes) e podem ajudar com vários problemas. Por exemplo, as novas tentativas automáticas de tarefas podem resolver problemas urgentes, como:

É possível configurar novas tentativas automáticas para cada tarefa ao criar um job. Especificamente, para cada tarefa, você pode usar uma das seguintes opções de configuração:

  • Por padrão, cada tarefa não é repetida quando falha.
  • Repetir tarefas em caso de falha: é possível configurar o número máximo de vezes para repetir automaticamente tarefas com falha. É possível especificar entre 0 (padrão) e 10 novas tentativas.
  • Repetir tarefas em caso de algumas falhas: é possível configurar diferentes ações de tarefa (repetição automática ou falha sem repetição) para falhas específicas. A ação oposta é realizada para todas as falhas não especificadas. Falhas específicas podem ser identificadas por um código de saída definido pelo aplicativo ou pelo Batch.

Antes de começar

  1. Se você nunca usou o Batch, leia Começar a usar o Batch e ative o serviço concluindo os pré-requisitos para projetos e usuários.
  2. Para receber as permissões necessárias para criar um job, peça ao administrador para conceder a você os seguintes papéis do IAM:

    Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

    Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de outros papéis predefinidos.

Repetir tarefas para todas as falhas

É possível definir o número máximo de novas tentativas automáticas (campo maxRetryCount) para as tarefas com falha de um job usando a CLI gcloud ou a API Batch.

gcloud

  1. Crie um arquivo JSON que especifique os detalhes de configuração do job e o campo maxRetryCount.

    Por exemplo, para criar um job de script básico que especifica o número máximo de tentativas para tarefas com falha, crie um arquivo JSON com o seguinte conteúdo:

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ],
            
            "maxRetryCount": MAX_RETRY_COUNT
            
          },
          "taskCount": 3
        }
      ],
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    Substitua MAX_RETRY_COUNT pelo número máximo de novas tentativas para cada tarefa. Para que um job possa repetir tarefas com falha, esse valor precisa ser definido como um número inteiro entre 1 e 10. Se o campo maxRetryCount não for especificado, o valor padrão será 0, o que significa não tentar novamente nenhuma tarefa.

  2. Para criar e executar o job, use o comando gcloud batch jobs submit:

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    Substitua:

    • JOB_NAME: o nome do job.

    • LOCATION: o local do job.

    • JSON_CONFIGURATION_FILE: o caminho para um arquivo JSON com os detalhes de configuração do job.

API

Faça uma solicitação POST ao método jobs.create que especifica o campo maxRetryCount.

Por exemplo, para criar um job de script básico que especifique o número máximo de novas tentativas para tarefas com falha, faça a seguinte solicitação:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
            }
          }
        ],
        
        "maxRetryCount": MAX_RETRY_COUNT
        
      },
      "taskCount": 3
    }
  ],
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

Substitua:

  • PROJECT_ID: o ID do projeto do seu projeto.

  • LOCATION: o local do job.

  • JOB_NAME: o nome do job.

  • MAX_RETRY_COUNT: o número máximo de novas tentativas para cada tarefa. Para que um job possa repetir tarefas com falha, esse valor precisa ser definido como um número inteiro entre 1 e 10. Se o campo maxRetryCount não for especificado, o valor padrão será 0, o que significa não tentar novamente nenhuma tarefa.

Repetir tarefas em caso de algumas falhas

É possível definir como um job vai lidar com diferentes falhas de tarefas usando políticas de ciclo de vida (campo lifecyclePolicies[]).

Uma política de ciclo de vida consiste em uma ação (campo action), condição de ação (campo actionCondition) e código de saída (campo exitCodes[]). A ação especificada é realizada sempre que a condição de ação (um código de saída específico) ocorre. É possível especificar uma das seguintes ações:

  • RETRY_TASK: tenta novamente as tarefas que falham com os códigos de saída especificados no campo exitCodes[]. As tarefas que falham com códigos de saída não especificados não são executadas novamente.
  • FAIL_TASK: não tente novamente as tarefas que falharem com os códigos de saída especificados no campo exitCodes[]. As tarefas que falham com códigos de saída não especificados são retentadas.

Principalmente, as tarefas que falham com códigos de saída não especificados tomam a ação oposta: alguns códigos de saída são repetidos e outros falham. Consequentemente, para que a política de ciclo de vida funcione como esperado, também é necessário definir o número máximo de novas tentativas automáticas (campo maxRetryCount) para permitir que o job tente novamente as tarefas com falha pelo menos uma vez.

Cada código de saída representa uma falha específica definida pelo aplicativo ou pelo Batch. Os códigos de saída de 50001 a 59999 são reservados e definidos pelo Batch. Para mais informações sobre os códigos de saída reservados, consulte Solução de problemas.

É possível especificar que um job repita ou falhe tarefas após falhas específicas usando a CLI gcloud ou a API Batch.

gcloud

  1. Crie um arquivo JSON que especifique os detalhes de configuração do job, o campo maxRetryCount e os subcampos lifecyclePolicies[].

    Para criar um job de script básico que repete tarefas com falha apenas para alguns códigos de saída, crie um arquivo JSON com o seguinte conteúdo:

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ],
            
            "maxRetryCount": MAX_RETRY_COUNT,
            "lifecyclePolicies": [
              {
                "action": "ACTION",
                "actionCondition": {
                   "exitCodes": [EXIT_CODES]
                }
              }
            ]
          }
        }
      ],
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    Substitua:

    • MAX_RETRY_COUNT: o número máximo de novas tentativas para cada tarefa. Para que um job possa repetir tarefas com falha, esse valor precisa ser definido como um número inteiro entre 1 e 10. Se o campo maxRetryCount não for especificado, o valor padrão será 0, o que significa não tentar novamente nenhuma tarefa.

    • ACTION: a ação, RETRY_TASK ou FAIL_TASK, que você quer para tarefas que falham com os códigos de saída especificados. As tarefas que falham com códigos de saída não especificados realizam a outra ação.

    • EXIT_CODES: uma lista separada por vírgulas de um ou mais códigos de saída que você quer acionar a ação especificada. Por exemplo, 50001, 50002.

      Cada código de saída pode ser definido pelo aplicativo ou pelo Batch. Os códigos de saída de 50001 a 59999 são reservados pelo Batch. Para mais informações sobre os códigos de saída reservados, consulte Solução de problemas.

    Por exemplo, o job a seguir só tenta novamente as tarefas que falham devido à preempção de VMs do Spot.

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "sleep 30"
                }
              }
            ],
            "maxRetryCount": 3,
            "lifecyclePolicies": [
              {
                 "action": "RETRY_TASK",
                 "actionCondition": {
                   "exitCodes": [50001]
                }
              }
            ]
          }
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            "policy": {
              "machineType": "e2-standard-4",
              "provisioningModel": "SPOT"
            }
          }
        ]
      }
    }
    
  2. Para criar e executar o job, use o comando gcloud batch jobs submit:

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    Substitua:

    • JOB_NAME: o nome do job.

    • LOCATION: o local do job.

    • JSON_CONFIGURATION_FILE: o caminho para um arquivo JSON com os detalhes de configuração do job.

API

Faça uma solicitação POST para o método jobs.create que especifica o campo maxRetryCount e os subcampos lifecyclePolicies[].

Para criar um job de script básico que repete tarefas com falha apenas para alguns códigos de saída, faça a seguinte solicitação:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
            }
          }
        ],
        
        "maxRetryCount": MAX_RETRY_COUNT,
        "lifecyclePolicies": [
          {
            "action": "ACTION",
            "actionCondition": {
                "exitCodes": [EXIT_CODES]
            }
          }
        ]
      }
    }
  ],
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

Substitua:

  • PROJECT_ID: o ID do projeto do seu projeto.

  • LOCATION: o local do job.

  • JOB_NAME: o nome do job.

  • MAX_RETRY_COUNT: o número máximo de novas tentativas para cada tarefa. Para que um job possa repetir tarefas com falha, esse valor precisa ser definido como um número inteiro entre 1 e 10. Se o campo maxRetryCount não for especificado, o valor padrão será 0, o que significa não tentar novamente nenhuma tarefa.

  • ACTION: a ação, RETRY_TASK ou FAIL_TASK, que você quer para tarefas que falham com os códigos de saída especificados. As tarefas que falham com códigos de saída não especificados realizam a outra ação.

  • EXIT_CODES: uma lista separada por vírgulas de um ou mais códigos de saída que você quer acionar a ação especificada. Por exemplo, 50001, 50002.

    Cada código de saída pode ser definido pelo aplicativo ou pelo Batch. Os códigos de saída de 50001 a 59999 são reservados pelo Batch. Para mais informações sobre os códigos de saída reservados, consulte Solução de problemas.

Por exemplo, o job a seguir só tenta novamente as tarefas que falham devido à preempção de VMs do Spot.

POST https://batch.googleapis.com/v1/projects/example-project/locations/us-central1/jobs?job_id=example-job

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "sleep 30"
            }
          }
        ],
        "maxRetryCount": 3,
        "lifecyclePolicies": [
          {
             "action": "RETRY_TASK",
             "actionCondition": {
               "exitCodes": [50001]
            }
          }
        ]
      }
    }
  ],
  "allocationPolicy": {
    "instances": [
      {
        "policy": {
          "machineType": "e2-standard-4",
          "provisioningModel": "SPOT"
        }
      }
    ]
  }
}

Modificar o comportamento da tarefa com base no número de novas tentativas

Se quiser, depois de ativar as novas tentativas automáticas para uma tarefa conforme descrito nas seções anteriores desta página, atualize os executáveis para usar a variável de ambiente predefinida BATCH_TASK_RETRY_ATTEMPT. A variável BATCH_TASK_RETRY_ATTEMPT descreve o número de vezes que essa tarefa já foi tentada. Use a variável BATCH_TASK_RETRY_ATTEMPT nos executáveis se quiser que uma tarefa se comporte de maneira diferente com base no número de tentativas. Por exemplo, quando uma tarefa está sendo repetida, talvez você queira confirmar quais comandos já foram executados com sucesso na tentativa anterior. Para mais informações, consulte Variáveis de ambiente predefinidas.

A seguir