Automatiza los reintentos de tareas

En esta página, se describe cómo volver a intentar tareas automáticamente después de todas o algunas fallas.

Un trabajo por lotes falla cuando al menos una de sus tareas falla, lo que puede suceden por varias razones. Según la configuración predeterminada, cada tarea en un trabajo solo se ejecuta una vez. si si una tarea falla, no se reintenta. Sin embargo, algunos problemas que hacen que una tarea falle se pueden resolver fácilmente con solo volver a intentarla. En estos casos, configurar el trabajo para que vuelva a intentar las tareas automáticamente puede ayudar a reducir significativamente los problemas de solución de problemas y el tiempo de ejecución general de tus trabajos.

Los reintentos automáticos son más adecuados para tareas con acoplamiento bajo (independientes) y puede ayudar con una variedad de problemas. Por ejemplo, las reintentos automáticos de tareas pueden resolver problemas urgentes, como los siguientes:

Puedes configurar la reintentos automáticos de tareas para cada tarea cuando creas un trabajo. Específicamente, para cada tarea, puedes usar uno de los siguientes opciones de configuración:

  • De forma predeterminada, no se reintenta cada tarea cuando falla.
  • Reintentar las tareas para todas las fallas: Puedes configurar la cantidad máxima de veces para reintentar automáticamente las tareas con errores. Tú puede especificar entre 0 (predeterminado) y 10 reintentos.
  • Reintentar las tareas en caso de algunas fallas: Puedes configurar diversas tareas acciones, ya sea reintento automático o falla sin reintento, por fallas específicas. Se realiza la acción opuesta para todas las fallas no especificadas. Cada falla específica se puede identificar mediante un código de salida que define tu aplicación o lote.

Antes de comenzar

  1. Si nunca usaste Batch, revisa Comienza a usar Batch y habilitar Batch completando el requisitos previos para los proyectos y usuarios.
  2. A fin de obtener los permisos que necesitas para crear un trabajo, solicita a tu administrador que te otorgue el los siguientes roles de IAM:

    Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

    También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.

Reintentar las tareas para todas las fallas

Puedes definir la cantidad máxima de reintentos automáticos (campo maxRetryCount) para las tareas fallidas de un trabajo con la CLI de gcloud o la API de Batch.

gcloud

  1. Crear un archivo JSON que especifique los detalles de configuración del trabajo y la maxRetryCount.

    Por ejemplo, para crear un trabajo de secuencia de comandos básico que especifique la cantidad máxima reintentos para tareas con errores, crea un archivo JSON con el siguiente contenido:

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

    Reemplaza MAX_RETRY_COUNT por la cantidad máxima. de reintentos para cada tarea. Para que un trabajo pueda reintentar las tareas con errores, este valor debe establecerse en un número entero entre 1 y 10. Si no se especifica el campo maxRetryCount, el valor predeterminado es 0. lo que significa no reintentar ninguna tarea.

  2. Para crear y ejecutar el trabajo, usa el Comando gcloud batch jobs submit:

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

    Reemplaza lo siguiente:

    • JOB_NAME: Es el nombre del trabajo.

    • LOCATION: Es la ubicación del trabajo.

    • JSON_CONFIGURATION_FILE: Es la ruta de acceso a un archivo JSON con los detalles de configuración de la tarea.

API

Realiza una solicitud POST al Método jobs.create que especifique el campo maxRetryCount.

Por ejemplo, para crear un trabajo de secuencia de comandos básico que especifique la cantidad máxima de reintentos para las tareas fallidas, realiza la siguiente solicitud:

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

Reemplaza lo siguiente:

  • PROJECT_ID: el ID del proyecto de tu proyecto.

  • LOCATION: Es la ubicación. del trabajo.

  • JOB_NAME: Es el nombre del trabajo.

  • MAX_RETRY_COUNT: Es la cantidad máxima de reintentos para cada tarea. Para que un trabajo pueda volver a intentar tareas fallidas, este valor debe establecerse en un número entero entre 1 y 10. Si no se especifica el campo maxRetryCount, el valor predeterminado es 0. lo que significa no reintentar ninguna tarea.

Reintentar las tareas en caso de algunas fallas

Puedes definir cómo quieres que un trabajo maneje diferentes tareas fallidas mediante políticas del ciclo de vida (campo lifecyclePolicies[]).

Una política de ciclo de vida consta de una acción (campo action), condición de acción (campo actionCondition) y un código de salida (campo exitCodes[]). Se realiza la acción especificada siempre que una condición de acción específica (un código de salida específico). Puedes especificar una de las siguientes acciones:

  • RETRY_TASK: Vuelve a intentar las tareas que fallan con los códigos de salida especificados en el campo exitCodes[]. Las tareas que fallan con códigos de salida no especificados se no se vuelve a intentar.
  • FAIL_TASK: No reintentes tareas que fallen con los códigos de salida especificados en el exitCodes[]. Las tareas que fallan con códigos de salida no especificados se se vuelve a intentar.

En particular, las tareas que fallan con códigos de salida no especificados realizan la acción opuesta: algunos códigos de salida se vuelven a intentar y otros fallan. Por lo tanto, para que la política del ciclo de vida funcione como se espera, también debes definir cantidad máxima de reintentos automáticos (campo maxRetryCount) para permitir que el trabajo reintente automáticamente las tareas con errores al menos una vez.

Cada código de salida representa una falla específica que se define por tu aplicación o Batch. Los códigos de salida de 50001 a 59999 se reservan y definen por por lotes. Para obtener más información sobre los códigos de salida reservados, consulta Solución de problemas

Puedes especificar que un trabajo reintente o rechace las tareas después de fallas específicas con gcloud CLI o la API de Batch.

gcloud

  1. Crear un archivo JSON que especifique los detalles de configuración del trabajo, el maxRetryCount y los subcampos lifecyclePolicies[].

    Para crear un trabajo de secuencia de comandos básico que reintente tareas fallidas solo para algunos códigos de salida, crea un archivo JSON con el siguiente contenido:

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

    Reemplaza lo siguiente:

    • MAX_RETRY_COUNT: La cantidad máxima de reintentos para cada tarea. Para que un trabajo pueda volver a intentar tareas fallidas, este valor debe establecerse en un número entero entre 1 y 10. Si no se especifica el campo maxRetryCount, el valor predeterminado es 0. lo que significa no reintentar ninguna tarea.

    • ACTION: Es la acción, ya sea RETRY_TASK o FAIL_TASK, que quieres para las tareas que fallan los códigos de salida especificados. Las tareas que fallan con códigos de salida no especificados realizan la otra acción.

    • EXIT_CODES: una lista separada por comas de uno o más códigos de salida que desees que activen la acción acción, por ejemplo, 50001, 50002.

      Tu aplicación o el comando por lotes pueden definir cada código de salida. Los códigos de salida de 50001 a 59999 están reservadas por Batch. Para obtener más información sobre los códigos de salida reservados, consulta Solución de problemas

    Por ejemplo, el siguiente trabajo solo reintenta las tareas que fallan debido a la interrupción de las 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 crear y ejecutar la tarea, usa el comando gcloud batch jobs submit:

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

    Reemplaza lo siguiente:

    • JOB_NAME: Es el nombre del trabajo.

    • LOCATION: Es la ubicación del trabajo.

    • JSON_CONFIGURATION_FILE: Es la ruta de acceso a un archivo JSON con los detalles de configuración de la tarea.

API

Realiza una solicitud POST al Método jobs.create que especifique el campo maxRetryCount y los subcampos lifecyclePolicies[].

Para crear un trabajo de secuencia de comandos básico que vuelva a intentar las tareas fallidas solo para algunos códigos de salida, realiza la siguiente solicitud:

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

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID del proyecto de tu proyecto.

  • LOCATION: Es la ubicación del trabajo.

  • JOB_NAME: Es el nombre del trabajo.

  • MAX_RETRY_COUNT: La cantidad máxima de reintentos para cada tarea. Para que un trabajo pueda volver a intentar tareas fallidas, este valor debe establecerse en un número entero entre 1 y 10. Si no se especifica el campo maxRetryCount, el valor predeterminado es 0, lo que significa que no se volverá a intentar ninguna tarea.

  • ACTION: Es la acción, ya sea RETRY_TASK o FAIL_TASK, que quieres para las tareas que fallan los códigos de salida especificados. Las tareas que fallan con códigos de salida no especificados realizan la otra acción.

  • EXIT_CODES: una lista separada por comas de uno o más códigos de salida que desees que activen la acción acción, por ejemplo, 50001, 50002.

    Tu aplicación o el comando por lotes pueden definir cada código de salida. Batch reserva los códigos de salida de 50001 a 59999. Para obtener más información sobre los códigos de salida reservados, consulta Solución de problemas

Por ejemplo, el siguiente trabajo solo reintenta las tareas que fallan debido a la interrupción de las 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"
        }
      }
    ]
  }
}

Modifica el comportamiento de las tareas según la cantidad de reintentos

De manera opcional, después de habilitar las reintentos automáticos para una tarea, como se describe en las secciones anteriores de esta página, puedes actualizar tus ejecutables para que usen la variable de entorno predefinida BATCH_TASK_RETRY_ATTEMPT. La variable BATCH_TASK_RETRY_ATTEMPT describe la cantidad de veces que esta tarea ya se intentó. Usa el La variable BATCH_TASK_RETRY_ATTEMPT en tus ejecutables si quieres que una tarea se comporte de manera diferente según la cantidad de reintentos. Por ejemplo, cuando se reintenta una tarea, es posible que desees confirmar qué comandos ya se ejecutaron correctamente en en el intento anterior. Para obtener más información, consulta Variables de entorno predefinidas.

¿Qué sigue?