Automatize as novas tentativas de tarefas

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

Uma tarefa em lote falha quando, pelo menos, uma das respetivas tarefas falha, o que pode acontecer por vários motivos. Por predefinição, cada tarefa num trabalho é executada apenas uma vez. Se uma tarefa falhar, não é repetida. No entanto, alguns problemas que fazem com que uma tarefa falhe podem ser facilmente resolvidos apenas ao tentar novamente a tarefa. Nestes casos, a configuração da tarefa para repetir automaticamente as tarefas pode ajudar substancialmente a reduzir a dificuldade de resolução de problemas e o tempo de execução geral das suas tarefas.

As novas tentativas automáticas são adequadas para tarefas pouco acopladas (independentes) e podem ajudar com vários problemas. Por exemplo, as novas tentativas automáticas de tarefas podem resolver problemas sensíveis ao tempo, como os seguintes:

Pode configurar novas tentativas automáticas de tarefas para cada tarefa quando cria um trabalho. Especificamente, para cada tarefa, pode usar uma das seguintes opções de configuração:

  • Por predefinição, cada tarefa não é repetida quando falha.
  • Repetir tarefas para todas as falhas: pode configurar o número máximo de vezes que as tarefas com falhas são repetidas automaticamente. Pode especificar entre 0 (predefinição) e 10 novas tentativas.
  • Voltar a tentar tarefas em caso de algumas falhas: pode configurar diferentes ações de tarefas, quer seja voltar a tentar automaticamente ou falhar sem voltar a tentar, para falhas específicas. A ação oposta é tomada para todas as falhas não especificadas. Pode identificar falhas específicas através de um código de saída definido pela sua aplicação ou lote.

Antes de começar

  1. Se nunca usou o Batch, reveja o artigo Comece a usar o Batch e ative o Batch concluindo os pré-requisitos para projetos e utilizadores.
  2. Para receber as autorizações de que precisa para criar uma tarefa, peça ao seu administrador para lhe conceder as seguintes funções de IAM:

    Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

    Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

Volte a tentar as tarefas para todas as falhas

Pode definir o número máximo de novas tentativas automáticas (campo maxRetryCount) para as tarefas com falhas de um trabalho através da CLI gcloud ou da API Batch.

gcloud

  1. Crie um ficheiro JSON que especifique os detalhes de configuração da tarefa e o campo maxRetryCount.

    Por exemplo, para criar uma tarefa de script básica que especifique o número máximo de repetições para tarefas com falhas, crie um ficheiro 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 uma tarefa possa repetir tarefas com falhas, este valor tem de ser definido como um número inteiro entre 1 e 10. Se o campo maxRetryCount não for especificado, o valor predefinido é 0, o que significa não repetir nenhuma tarefa.

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

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

    Substitua o seguinte:

    • JOB_NAME: o nome da tarefa.

    • LOCATION: a localização do trabalho.

    • JSON_CONFIGURATION_FILE: o caminho para um ficheiro JSON com os detalhes de configuração da tarefa.

API

Faça um pedido POST ao método jobs.create que especifica o campo maxRetryCount.

Por exemplo, para criar uma tarefa de script básica que especifique o número máximo de tentativas para tarefas com falhas, faça o seguinte pedido:

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 o seguinte:

  • PROJECT_ID: o ID do projeto do seu projeto.

  • LOCATION: a localização do trabalho.

  • JOB_NAME: o nome da tarefa.

  • MAX_RETRY_COUNT: o número máximo de novas tentativas para cada tarefa. Para que uma tarefa possa repetir tarefas com falhas, este valor tem de ser definido como um número inteiro entre 1 e 10. Se o campo maxRetryCount não for especificado, o valor predefinido é 0, o que significa não repetir nenhuma tarefa.

Repetir tarefas para algumas falhas

Pode definir como quer que uma tarefa processe diferentes falhas de tarefas através das políticas de ciclo de vida (campo lifecyclePolicies[]).

Uma política de ciclo de vida consiste numa 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 ocorrer a condição de ação, ou seja, um código de saída específico. Pode especificar uma das seguintes ações:

  • RETRY_TASK: repetir 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 repetidas.
  • FAIL_TASK: não volte a tentar 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 são repetidas.

Em particular, todas 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 tem de definir o número máximo de novas tentativas automáticas (campo maxRetryCount) para permitir que a tarefa tente novamente as tarefas com falhas, pelo menos, uma vez.

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

Pode especificar que uma tarefa seja repetida ou falhe após falhas específicas usando a CLI gcloud ou a API Batch.

gcloud

  1. Crie um ficheiro JSON que especifique os detalhes de configuração da tarefa, o campo maxRetryCount e os subcampos lifecyclePolicies[].

    Para criar uma tarefa de script básica que tenta novamente as tarefas com falhas apenas para alguns códigos de saída, crie um ficheiro 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 o seguinte:

    • MAX_RETRY_COUNT: o número máximo de novas tentativas para cada tarefa. Para que uma tarefa possa repetir tarefas com falhas, este valor tem de ser definido como um número inteiro entre 1 e 10. Se o campo maxRetryCount não for especificado, o valor predefinido é 0, o que significa não repetir nenhuma tarefa.

    • ACTION: a ação, RETRY_TASK ou FAIL_TASK, que quer para as 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 quer acionar a ação especificada, por exemplo, 50001, 50002.

      Cada código de saída pode ser definido pela sua aplicação ou pelo processamento em lote. Os códigos de saída de 50001 a 59999 estão reservados para o processamento em lote. Para mais informações sobre os códigos de saída reservados, consulte a secção Resolução de problemas.

    Por exemplo, a seguinte tarefa só tenta novamente as tarefas que falham devido à remoção preventiva de VMs 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 a tarefa, use o comando gcloud batch jobs submit:

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

    Substitua o seguinte:

    • JOB_NAME: o nome da tarefa.

    • LOCATION: a localização do trabalho.

    • JSON_CONFIGURATION_FILE: o caminho para um ficheiro JSON com os detalhes de configuração da tarefa.

API

Faça um pedido POST ao método jobs.create que especifica o campo maxRetryCount e os subcampos lifecyclePolicies[].

Para criar uma tarefa de script básica que tenta novamente as tarefas com falhas apenas para alguns códigos de saída, faça o seguinte pedido:

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 o seguinte:

  • PROJECT_ID: o ID do projeto do seu projeto.

  • LOCATION: a localização do trabalho.

  • JOB_NAME: o nome da tarefa.

  • MAX_RETRY_COUNT: o número máximo de novas tentativas para cada tarefa. Para que uma tarefa possa repetir tarefas com falhas, este valor tem de ser definido como um número inteiro entre 1 e 10. Se o campo maxRetryCount não for especificado, o valor predefinido é 0, o que significa não repetir nenhuma tarefa.

  • ACTION: a ação, RETRY_TASK ou FAIL_TASK, que quer para as 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 quer acionar a ação especificada, por exemplo, 50001, 50002.

    Cada código de saída pode ser definido pela sua aplicação ou pelo processamento em lote. Os códigos de saída de 50001 a 59999 estão reservados para o processamento em lote. Para mais informações sobre os códigos de saída reservados, consulte a secção Resolução de problemas.

Por exemplo, a seguinte tarefa só tenta novamente as tarefas que falham devido à remoção preventiva de VMs 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"
        }
      }
    ]
  }
}

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

Opcionalmente, depois de ativar as novas tentativas automáticas para uma tarefa, conforme descrito nas secções anteriores desta página, pode atualizar os seus runnables 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 esta tarefa já foi tentada. Use a variável BATCH_TASK_RETRY_ATTEMPT nos seus executáveis se quiser que uma tarefa se comporte de forma diferente com base no número de novas tentativas. Por exemplo, quando uma tarefa está a ser repetida, pode querer confirmar que comandos já foram executados com êxito na tentativa anterior. Para mais informações, consulte o artigo Variáveis de ambiente predefinidas.

O que se segue?