Compartir a través de


Reintento

SE APLICA A: todos los niveles de API Management

La directiva retry ejecuta sus directivas secundarias una vez y después vuelve a tratar de ejecutarla hasta que el elemento condition del reintento pasa a ser false o se agota el número correspondiente al elemento count del reintento.

La retry directiva puede contener cualquier otra directiva como sus elementos secundarios, excepto para wait la directiva.

Nota:

Establezca los elementos de la directiva y los elementos secundarios en el orden proporcionado en la instrucción de directiva. Obtenga más información sobre el establecimiento o modificación de directivas de API Management.

Instrucción de la directiva

<retry
    condition="Boolean expression or literal"
    count="number of retry attempts"
    interval="retry interval in seconds"
    max-interval="maximum retry interval in seconds"
    delta="retry interval delta in seconds"
    first-fast-retry="boolean expression or literal">
        <!-- One or more child policies. No restrictions. -->
</retry>

Atributos

Atributo Descripción Necesario Valor predeterminado
condición booleano. Especifica si los reintentos se deben detener (false) o continuar (true). Se permiten expresiones de directiva. N/D
Recuento Número positivo entre 1 y 50 que especifica el número de reintentos que se van a intentar. Se permiten expresiones de directiva. N/D
intervalo Número positivo en segundos que especifica el intervalo de espera entre los reintentos. Se permiten expresiones de directiva. N/D
max-interval Número positivo en segundos que especifica el intervalo máximo de espera entre los reintentos. Se utiliza para implementar un algoritmo exponencial de reintentos. Se permiten expresiones de directiva. No N/D
delta Número positivo en segundos que especifica el incremento del intervalo de espera. Se usa para implementar los algoritmos lineales y exponenciales de reintentos. Se permiten expresiones de directiva. No N/D
primer reintento rápido booleano. Si se establece en true, el primer reintento se lleva a cabo inmediatamente. Se permiten expresiones de directiva. No false

Tiempos de espera de reintento

  • Cuando solamente se especifica interval, los reintentos se llevan a cabo a intervalos interval.

  • Cuando solo se especifican los valores de interval y delta, se usa un algoritmo de reintento de intervalo lineal. El tiempo de espera entre reintentos aumenta según la fórmula siguiente: interval + (count - 1)*delta.

  • Cuando se especifican los valores de interval, max-interval y delta, se aplica un algoritmo de reintento de intervalo exponencial. El tiempo de espera entre los reintentos aumenta exponencialmente según la fórmula siguiente: interval + (2^(count - 1)) * random(delta * 0.8, delta * 1.2), hasta un intervalo máximo establecido por max-interval.

    Por ejemplo, cuando interval y delta se establecen en 10 segundos y max-interval es igual a 100 segundos, el tiempo de espera aproximado entre reintentos aumenta de la siguiente manera: 10 segundos, 20 segundos, 40 segundos, 80 segundos, y un tiempo de espera de 100 segundos para el resto de reintentos.

Elementos

La retry directiva puede contener cualquier otra directiva como sus elementos secundarios, excepto para wait la directiva.

Uso

Notas de uso

  • La directiva ejecuta las directivas secundarias en el retry bloque antes de evaluar la condition para ejecutar el primer reintento.

Ejemplos

Reenvío de solicitudes con reintento exponencial

En el siguiente ejemplo de solicitud, el reenvío de solicitud se vuelve a intentar hasta diez veces usando un algoritmo exponencial de reintentos. Dado que first-fast-retry se establece en false, todos los reintentos están sujetos a tiempos de espera de reintento exponencialmente crecientes (en este ejemplo, aproximadamente 10 segundos, 20 segundos, 40 segundos, ...), hasta una espera máxima de max-interval.

<retry
    condition="@(context.Response.StatusCode == 500)"
    count="10"
    interval="10"
    max-interval="100"
    delta="10"
    first-fast-retry="false">
        <forward-request buffer-request-body="true" />
</retry>

Envío de una solicitud tras un error de solicitud inicial

En el ejemplo siguiente, el envío de una solicitud a una dirección URL distinta del back-end definido se reintenta hasta tres veces si la conexión cae o se agota el tiempo de espera, o la solicitud produce un error del lado servidor. Como first-fast-retry se establece en true, el primer reintento se ejecuta inmediatamente después del error de solicitud inicial. Tenga en cuenta que send-requestdebe establecerseignore-error en true para response-variable-nameque sea null en caso de error.


<retry
    condition="@(context.Variables["response"] == null || ((IResponse)context.Variables["response"]).StatusCode >= 500)"
    count="3"
    interval="1"
    first-fast-retry="true">
        <send-request 
            mode="new" 
            response-variable-name="response" 
            timeout="3" 
            ignore-error="true">
		        <set-url>https://api.contoso.com/products/5</set-url>
		        <set-method>GET</set-method>
		</send-request>
</retry>

Cambiar back-end cuando se recibe un error

En el ejemplo siguiente, la solicitud inicial se envía al back-end principal. Si se devuelve un 429 Too Many Requests código de estado de respuesta, la solicitud se reintenta inmediatamente y se reenvía al back-end secundario.

<backend>
    <retry
        condition="@(context.Response != null && context.Response.StatusCode == 429)"
        count="1"
        interval="1"
        first-fast-retry="true">
           <set-variable name="attempt-count" value="@(context.Variables.GetValueOrDefault<int>("attempt-count", 0)+1)" />
           <set-backend-service backend-id="@(context.Variables.GetValueOrDefault<int>("attempt-count") < 2 ? "primary-backend" : "secondary-backend" )" />
           <forward-request />
    </retry>
</backend>

Sugerencia

Como alternativa, puede configurar un recurso de back-end con reglas de disyuntor para detectar condiciones de error y un grupo con equilibrio de carga que distribuye las solicitudes entre varios back-end.

Para más información sobre el trabajo con directivas, vea: