Cómo reintentar tareas de aplicaciones fallidas

Las tareas de aplicaciones que se procesan a través de una lista de tareas en cola pueden fallar por muchas razones. Si un controlador no puede ejecutar una tarea (y, por lo tanto, muestra cualquier código de estado HTTP fuera del rango 200–299), App Engine reintenta la tarea hasta que se ejecuta con éxito.

Según la configuración predeterminada, el sistema reduce de forma gradual la tasa de reintentos para no sobrecargar tu aplicación con demasiadas solicitudes, pero programa los reintentos con el objetivo de que se produzcan una vez por hora como máximo hasta que la tarea se ejecute de forma correcta.

Reintenta tareas

Si agregas el elemento reintentar parámetros en queue.xml, puedes personalizar tu propio esquema para realizar los reintentos de tareas. Esto te permite especificar la cantidad máxima de veces que se reintentarán las tareas fallidas en una cola específica. También puedes establecer un límite de tiempo para reintentar y controlar el intervalo entre intentos.

En el siguiente ejemplo, se muestran varias situaciones de reintento:

  • En fooqueue, las tareas se vuelven a intentar hasta siete veces y durante dos días, como máximo, desde el primer intento de ejecución. Una vez que se pasan ambos límites, la tarea falla de forma permanente.
  • En barqueue, App Engine aumenta el intervalo linealmente entre cada reintento hasta alcanzar la máxima retirada para reintentar las tareas, y lo hace de manera indefinida en el intervalo máximo (por lo que los intervalos entre solicitudes son de 10 segundos, 20, 30, …, 190, 200, 200, …).
  • En bazqueue, el intervalo de reintento comienza con 10 segundos, luego, se duplica tres veces, después, aumenta de forma lineal y, por último, se reintenta de forma indefinida en el intervalo máximo (por lo que los intervalos entre solicitudes son de 10 segundos, 20, 40, 80, 160, 240, 300, 300, …).
<?xml version="1.0" encoding="utf-8"?>
<queue-entries>
  <queue>
    <name>fooqueue</name>
    <rate>1/s</rate>
    <retry-parameters>
      <task-retry-limit>7</task-retry-limit>
      <task-age-limit>2d</task-age-limit>
    </retry-parameters>
  </queue>
  <queue>
    <name>barqueue</name>
    <rate>1/s</rate>
    <retry-parameters>
      <min-backoff-seconds>10</min-backoff-seconds>
      <max-backoff-seconds>200</max-backoff-seconds>
      <max-doublings>0</max-doublings>
    </retry-parameters>
  </queue>
  <queue>
    <name>bazqueue</name>
    <rate>1/s</rate>
    <retry-parameters>
      <min-backoff-seconds>10</min-backoff-seconds>
      <max-backoff-seconds>300</max-backoff-seconds>
      <max-doublings>3</max-doublings>
    </retry-parameters>
  </queue>
</queue-entries>

Próximos pasos