Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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. |
Sí | 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. | Sí | N/D |
| intervalo | 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 |
| 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 intervalosinterval.Cuando solo se especifican los valores de
intervalydelta, 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-intervalydelta, 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
intervalydeltase establecen en 10 segundos ymax-intervales 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
- 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
Notas de uso
- La directiva ejecuta las directivas secundarias en el
retrybloque antes de evaluar laconditionpara 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.
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
- Repositorio de área de juegos de directivas
- Kit de herramientas de directivas de Azure API Management
- Obtener ayuda de Copilot para crear, explicar y solucionar problemas de directivas