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. |
Sí | 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. | Sí | N/D |
interval | Número positivo en segundos que especifica el intervalo de espera entre los reintentos. Se permiten expresiones de directiva. | Sí | 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 intervalosinterval
.Cuando solo se especifican los valores de
interval
ydelta
, 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
ydelta
, 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 pormax-interval
.Por ejemplo, cuando
interval
ydelta
se establecen en 10 segundos ymax-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
- Secciones de directiva: entrante, saliente, back-end, on-error
- Ámbitos de la directiva: global, área de trabajo, producto, API, operación
- Puertas de enlace: clásica, v2, consumo, autohospedada y área de trabajo
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-request
debe establecerseignore-error
en true para response-variable-name
que 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>
Directivas relacionadas
Contenido relacionado
Para más información sobre el trabajo con directivas, vea:
- Tutorial: Transformación y protección de una API
- Referencia de directivas para una lista completa de instrucciones de directivas y su configuración
- Expresiones de directiva
- Establecimiento o edición de directivas
- Reutilización de configuraciones de directivas
- Repositorio de fragmentos de código de directiva
- Creación de directivas mediante Microsoft Copilot en Azure