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.

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
count 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
interval 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
first-fast-retry 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 directiva retry puede contener cualquier otra directiva como elemento secundario.

Uso

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>

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