Automatiza los reintentos de tareas

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

Un trabajo por lotes falla cuando al menos una de sus tareas falla, lo que puede suceder por varios motivos. De forma predeterminada, cada tarea en un trabajo solo se ejecuta una vez; si una tarea falla, no se reintenta. Sin embargo, algunos problemas que causan que una tarea falle se pueden resolver fácilmente volviendo a intentar la tarea. En estos casos, configurar el trabajo para reintentar las tareas de forma automática puede ayudar de forma sustancial a reducir la fricción de la solución de problemas y el tiempo de ejecución general de los trabajos.

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

Puedes configurar reintentos automáticos de tareas para cada tarea cuando creas un trabajo. En particular, para cada tarea, puedes usar una de las siguientes opciones de configuración:

  • De forma predeterminada, no se reintenta cada tarea cuando falla.
  • Reintentar tareas para todas las fallas: Puedes configurar la cantidad máxima de veces que se reintentan automáticamente las tareas con errores. Puedes especificar entre 0 (predeterminado) y 10 reintentos.
  • Reintentar tareas para algunas fallas: Puedes configurar diferentes acciones de tareas, ya sea un reintento automático o una falla sin reintentos, para fallas específicas. Se realiza la acción opuesta para todas las fallas no especificadas. Las fallas específicas se pueden identificar con un código de salida definido por tu aplicación o Batch.

Antes de comenzar

Reintentar las tareas para todas las fallas

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

gcloud

  1. Crea un archivo JSON que especifique los detalles de configuración del trabajo y el campo maxRetryCount.

    Por ejemplo, para crear un trabajo de secuencia de comandos básico que especifique la cantidad máxima de 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 se debe establecer 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 debe 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 de un archivo JSON con los detalles de configuración del trabajo.

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 tareas con errores, 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: Es el ID del proyecto.

  • LOCATION: Es la ubicación del trabajo.

  • JOB_NAME: Es el nombre del trabajo.

  • MAX_RETRY_COUNT: La cantidad máxima de reintentos de cada tarea. Para que un trabajo pueda reintentar las tareas con errores, este valor se debe establecer 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 debe reintentar ninguna tarea.

Reintentar las tareas en caso de algunas fallas

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

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

  • RETRY_TASK: Reintenta 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 no se reintentan.
  • FAIL_TASK: No vuelvas a intentar tareas que fallen con los códigos de salida especificados en el campo exitCodes[]. Se reintentan las tareas que fallan con códigos de salida no especificados.

En particular, cualquier tarea que falla con códigos de salida no especificados toma la acción opuesta: algunos códigos de salida se reintentan y otros fallan. En consecuencia, para que la política del ciclo de vida funcione como se espera, también debes definir la 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 define tu aplicación o Batch. Batch reserva y define 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.

Puedes usar gcloud CLI o la API de Batch para especificar que un trabajo vuelva a realizar las tareas o las falle después de fallas específicas.

gcloud

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

    Si deseas 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: Es la cantidad máxima de reintentos de cada tarea. Para que un trabajo pueda reintentar las tareas con errores, este valor se debe establecer 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 debe reintentar ninguna tarea.

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

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

      Tu aplicación o Batch puede 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 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 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 de un archivo JSON con los detalles de configuración del trabajo.

API

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

Si deseas crear un trabajo de secuencia de comandos básico que reintente tareas con errores 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.

  • LOCATION: Es la ubicación del trabajo.

  • JOB_NAME: Es el nombre del trabajo.

  • MAX_RETRY_COUNT: Es la cantidad máxima de reintentos de cada tarea. Para que un trabajo pueda reintentar las tareas con errores, este valor se debe establecer 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 debe reintentar ninguna tarea.

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

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

    Tu aplicación o Batch puede 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 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 los reintentos automáticos para una tarea, como se describe en las secciones anteriores de esta página, puedes actualizar los ejecutables para que usen la variable de entorno predefinida BATCH_TASK_RETRY_ATTEMPT. Con la variable BATCH_TASK_RETRY_ATTEMPT, se describe la cantidad de veces que ya se ha intentado esta tarea. Usa 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 el intento anterior. Para obtener más información, consulta Variables de entorno predefinidas.

¿Qué sigue?