Automatiser les nouvelles tentatives d'exécution de tâches

Cette page explique comment réessayer automatiquement les tâches après tous les échecs ou certains d'entre eux.

Un job par lot échoue lorsqu'au moins une de ses tâches échoue, ce qui peut se produisent pour diverses raisons. Par défaut, chaque tâche d'un job ne s'exécute qu'une seule fois. si une tâche échoue, elle n'est pas relancée. Toutefois, certains problèmes qui entraînent l'échec d'une tâche peuvent être facilement résolus en la réessayant. Dans ces cas, configurer le job de façon à relancer automatiquement les tâches peut considérablement réduire la difficulté à résoudre les problèmes et la durée d'exécution globale de vos jobs.

Les nouvelles tentatives automatiques sont adaptées aux tâches faiblement couplées (indépendantes) et peuvent aider à résoudre divers problèmes. Par exemple, les nouvelles tentatives de tâches automatiques peuvent résoudre des problèmes urgents, comme les suivants :

Vous pouvez configurer des tentatives automatiques pour chaque tâche lorsque vous créez un job. Plus précisément, pour chaque tâche, vous pouvez utiliser l'une des méthodes suivantes : de configuration:

  • Par défaut, chaque tâche n'est pas relancée lorsqu'elle échoue.
  • Réessayer les tâches en cas d'échec : vous pouvez configurer le nombre maximal de nouvelles tentatives pour les tâches ayant échoué. Vous pouvez spécifier entre 0 (par défaut) et 10 nouvelles tentatives.
  • Réessayer les tâches en cas d'échec : vous pouvez configurer différentes actions de tâche (réessayer automatiquement ou échouer sans nouvelle tentative) pour des échecs spécifiques. L'action inverse est effectuée pour tous les échecs non spécifiés. Les échecs spécifiques peuvent être identifiés par un code de sortie défini par votre application ou Batch.

Avant de commencer

  1. Si vous n'avez jamais utilisé Batch, consultez Premiers pas avec Batch et activez Batch en remplissant les conditions préalables pour les projets et les utilisateurs.
  2. Pour obtenir les autorisations nécessaires à la création d'un job, demandez à votre administrateur de vous accorder le rôles IAM suivants:

    Pour en savoir plus sur l'attribution de rôles, consultez la page Gérer l'accès aux projets, aux dossiers et aux organisations.

    Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Relancer les tâches pour tous les échecs

Vous pouvez définir le nombre maximal de tentatives automatiques (champ maxRetryCount) pour les tâches échouées d'une tâche à l'aide de la CLI gcloud ou de l'API Batch.

gcloud

  1. Créez un fichier JSON qui spécifie les détails de configuration de la tâche et le champ maxRetryCount.

    Par exemple, pour créer un job de script de base qui spécifie le nombre maximal de nouvelles tentatives pour les tâches ayant échoué, créez un fichier JSON avec le contenu suivant:

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

    Remplacez MAX_RETRY_COUNT par le nombre maximal de tentatives pour chaque tâche. Pour qu'un job puisse relancer les tâches ayant échoué, cette valeur doit être un entier compris entre 1 et 10. Si le champ maxRetryCount n'est pas spécifié, la valeur par défaut est 0, ce qui signifie de ne pas relancer de tâches.

  2. Pour créer et exécuter le job, utilisez la Commande gcloud batch jobs submit:

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

    Remplacez les éléments suivants :

    • JOB_NAME: nom de la tâche.

    • LOCATION: emplacement du travail.

    • JSON_CONFIGURATION_FILE: chemin d'accès d'un fichier JSON contenant les détails de configuration du job.

API

Envoyez une requête POST à Méthode jobs.create spécifiant le champ maxRetryCount.

Par exemple, pour créer un job de script de base qui spécifie le nombre maximal pour les tâches ayant échoué, exécutez la requête suivante:

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"
  }
}

Remplacez les éléments suivants :

  • PROJECT_ID : ID de projet de votre projet.

  • LOCATION: emplacement du travail.

  • JOB_NAME : nom de la tâche.

  • MAX_RETRY_COUNT : nombre maximal de nouvelles tentatives pour chaque tâche. Pour qu'une tâche puisse relancer des tâches ayant échoué, cette valeur doit être définie sur un entier compris entre 1 et 10. Si le champ maxRetryCount n'est pas spécifié, la valeur par défaut est 0, ce qui signifie qu'aucune tâche ne doit être réessayée.

Réessayer d'effectuer des tâches en cas d'échec

Vous pouvez définir la manière dont une tâche doit gérer différentes échecs de tâches en utilisant Règles relatives au cycle de vie (champ lifecyclePolicies[]).

Une stratégie de cycle de vie se compose d'un action (champ action), condition d'action (champ actionCondition), et le code de sortie (champ exitCodes[]). L'action spécifiée est exécutée chaque fois que une condition d'action (code de sortie spécifique) se produit. Vous pouvez spécifier l'une des actions suivantes:

  • RETRY_TASK : réessayez les tâches qui échouent avec les codes de sortie spécifiés dans le champ exitCodes[]. Les tâches qui échouent avec un code de sortie non spécifié sont pas de nouvelle tentative.
  • FAIL_TASK : ne pas réessayer les tâches qui échouent avec les codes de sortie spécifiés dans le champ exitCodes[]. Les tâches qui échouent avec un code de sortie non spécifié sont nouvelle tentative.

Plus précisément, toutes les tâches qui échouent avec des codes de sortie non spécifiés effectuent l'action opposée : certains codes de sortie sont réessayés et d'autres échouent. Par conséquent, pour que la stratégie de cycle de vie fonctionne comme prévu, vous devez également définir Nombre maximal de tentatives automatiques (champ maxRetryCount) pour permettre au job de relancer automatiquement les tâches ayant échoué au moins une fois.

Chaque code de sortie représente un échec spécifique défini par votre application ou par Batch. Les codes de sortie de 50001 à 59999 sont réservés et définis par par lot. Pour en savoir plus sur les codes de sortie réservés, consultez Dépannage

Vous pouvez spécifier qu'une tâche doit être réessayée ou échouer après des échecs spécifiques à l'aide de la CLI gcloud ou de l'API Batch.

gcloud

  1. Créez un fichier JSON qui spécifie les détails de configuration du job, le maxRetryCount et les sous-champs lifecyclePolicies[].

    Pour créer une tâche de script de base qui réessaie les tâches échouées uniquement pour certains codes de sortie, créez un fichier JSON contenant les éléments suivants :

    {
      "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"
      }
    }
    

    Remplacez les éléments suivants :

    • MAX_RETRY_COUNT : nombre maximal de nouvelles tentatives pour chaque tâche. Pour qu'une tâche puisse relancer des tâches ayant échoué, cette valeur doit être définie sur un entier compris entre 1 et 10. Si le champ maxRetryCount n'est pas spécifié, la valeur par défaut est 0, ce qui signifie de ne pas relancer de tâches.

    • ACTION : action (RETRY_TASK ou FAIL_TASK) que vous souhaitez effectuer pour les tâches qui échouent avec les codes de sortie spécifiés. Tâches qui échouent avec une sortie non spécifiée les codes effectuent l'autre action.

    • EXIT_CODES : liste d'un ou de plusieurs codes de sortie séparés par une virgule pour lesquels vous souhaitez déclencher l'action spécifiée (par exemple, 50001, 50002).

      Chaque code de sortie peut être défini par l'application par lot. Les codes de sortie de 50001 à 59999 sont réservés par Batch. Pour en savoir plus sur les codes de sortie réservés, consultez Dépannage

    Par exemple, le job suivant ne relance que les tâches ayant échoué en raison à la préemption des VM 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. Pour créer et exécuter le job, utilisez la Commande gcloud batch jobs submit:

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

    Remplacez les éléments suivants :

    • JOB_NAME : nom de la tâche.

    • LOCATION : emplacement de la tâche.

    • JSON_CONFIGURATION_FILE : chemin d'accès à un fichier JSON contenant les détails de configuration de la tâche.

API

Envoyez une requête POST à Méthode jobs.create qui spécifie le champ maxRetryCount et les sous-champs lifecyclePolicies[].

Pour créer une tâche de script de base qui relance les tâches ayant échoué uniquement pour certains codes de sortie, effectuez la requête suivante :

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"
  }
}

Remplacez les éléments suivants :

  • PROJECT_ID: le ID du projet de votre projet.

  • LOCATION: emplacement du travail.

  • JOB_NAME : nom de la tâche.

  • MAX_RETRY_COUNT: nombre maximal de nouvelles tentatives pour chaque tâche. Pour qu'une tâche puisse relancer des tâches ayant échoué, cette valeur doit être définie sur un entier compris entre 1 et 10. Si le champ maxRetryCount n'est pas spécifié, la valeur par défaut est 0, ce qui signifie qu'aucune tâche ne doit être réessayée.

  • ACTION : action (RETRY_TASK ou FAIL_TASK) que vous souhaitez effectuer pour les tâches qui échouent avec les codes de sortie spécifiés. Tâches qui échouent avec une sortie non spécifiée les codes effectuent l'autre action.

  • EXIT_CODES : liste d'un ou de plusieurs codes de sortie séparés par une virgule pour lesquels vous souhaitez déclencher l'action spécifiée (par exemple, 50001, 50002).

    Chaque code de sortie peut être défini par l'application par lot. Les codes de sortie de 50001 à 59999 sont réservés par Batch. Pour en savoir plus sur les codes de sortie réservés, consultez Dépannage

Par exemple, le job suivant ne relance que les tâches ayant échoué en raison à la préemption des VM 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"
        }
      }
    ]
  }
}

Modifier le comportement des tâches en fonction du nombre de tentatives

Éventuellement, après avoir activé les nouvelles tentatives automatiques pour une tâche comme décrit dans les sections précédentes de cette page, vous pouvez mettez à jour vos exécutables afin d'utiliser Variable d'environnement prédéfinie BATCH_TASK_RETRY_ATTEMPT. La variable BATCH_TASK_RETRY_ATTEMPT décrit le nombre de fois que cette tâche a déjà été tentée. Utilisez les la variable BATCH_TASK_RETRY_ATTEMPT dans vos exécutables si vous souhaitez pour qu'une tâche se comporte différemment selon le nombre de tentatives. Par exemple, lorsqu'une tâche est en cours de nouvelle tentative, vous pouvez confirmer quelles commandes ont déjà été exécutées avec succès dans la précédente tentative. Pour en savoir plus, consultez la section Variables d'environnement prédéfinies.

Étape suivante