Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Vuelva a intentarlo con un patrón de retroceso
Intención
El patrón de reintentos con retraso mejora la estabilidad de la aplicación al reintentar de forma transparente las operaciones que fallan debido a errores transitorios.
Motivación
En las arquitecturas distribuidas, los errores transitorios pueden deberse a la limitación del servicio, la pérdida temporal de la conectividad de la red o la falta de disponibilidad temporal del servicio. Reintentar automáticamente las operaciones que fallan debido a estos errores transitorios mejora la experiencia del usuario y la resiliencia de la aplicación. Sin embargo, los reintentos frecuentes pueden sobrecargar el ancho de banda de la red y provocar conflictos. El retraso exponencial es una técnica en la que se reintentan las operaciones aumentando los tiempos de espera para un número específico de reintentos.
Aplicabilidad
Utilice el patrón de reintento con retraso cuando:
-
Sus servicios limitan con frecuencia la solicitud para evitar una sobrecarga, lo que resulta en una429 Demasiadas solicitudesexcepción al proceso de llamada.
-
La red participa de forma invisible en las arquitecturas distribuidas, y los problemas temporales de la red provocan errores.
-
El servicio que se está llamando no está disponible temporalmente, lo que provoca errores. Los reintentos frecuentes pueden provocar una degradación del servicio, a menos que introduzcas un tiempo de espera de demora mediante este patrón.
Cuestiones y consideraciones
-
Idempotencia: Si varias llamadas al método tienen el mismo efecto que una sola llamada en el estado del sistema, la operación se considera idempotente. Las operaciones deben ser idempotentes cuando utilice el patrón de reintento con retraso. De lo contrario, las actualizaciones parciales podrían dañar el estado del sistema.
-
Ancho de banda de red: Se puede producir una degradación del servicio si demasiados reintentos ocupan el ancho de banda de la red, lo que provoca tiempos de respuesta lentos.
-
Escenarios de error rápido: Para los errores no transitorios, si puede determinar la causa de la falla, es más eficiente fallar rápidamente utilizando el patrón del disyuntor.
-
Tasa de retraso: La introducción de un retraso exponencial puede repercutir en el tiempo de espera del servicio, lo que se traduce en tiempos de espera más prolongados para el usuario final.
Implementación
Arquitectura de alto nivel
El siguiente diagrama ilustra cómo el servicio A puede volver a intentar las llamadas al servicio B hasta que se devuelva una respuesta correcta. Si el servicio B no devuelve una respuesta correcta después de algunos intentos, el servicio A puede dejar de intentarlo y devolver un error a la persona que llama.
Implementación medianteAWSservicios
El siguiente diagrama muestra un flujo de trabajo de procesamiento de tickets en una plataforma de atención al cliente. Los boletos de clientes insatisfechos se agilizan al aumentar automáticamente la prioridad de los boletos. ElTicket info
La función Lambda extrae los detalles del billete y llama alGet sentiment
Función lambda. ElGet sentiment
La función Lambda comprueba las opiniones del cliente pasando la descripción aAmazon Comprende
Si la llamada alGet sentiment
La función Lambda produce un error y el flujo de trabajo vuelve a intentar la operación tres veces.AWS Step Functionspermite un retroceso exponencial al permitirle configurar el valor de retroceso.
En este ejemplo, se configuran un máximo de tres reintentos con un multiplicador de aumento de 1,5 segundos. Si el primer reintento se produce después de 3 segundos, el segundo se produce después de 3 x 1,5 segundos = 4,5 segundos y el tercer reintento se produce después de 4,5 x 1,5 segundos = 6,75 segundos. Si el tercer intento no tiene éxito, se produce un error en el flujo de trabajo. La lógica de retroceso no requiere ningún código personalizado; la proporciona como configuraciónAWS Step Functions.
Código de muestra
El siguiente código muestra la implementación del patrón de reintento con retraso.
public async Task DoRetriesWithBackOff() { int retries = 0; bool retry; do { //Sample object for sending parameters var parameterObj = new InputParameter { SimulateTimeout = "false" }; var content = new StringContent(JsonConvert.SerializeObject(parameterObj), System.Text.Encoding.UTF8, "application/json"); var waitInMilliseconds = Convert.ToInt32((Math.Pow(2, retries) - 1) * 100); System.Threading.Thread.Sleep(waitInMilliseconds); var response = await _client.PostAsync(_baseURL, content); switch (response.StatusCode) { //Success case HttpStatusCode.OK: retry = false; Console.WriteLine(response.Content.ReadAsStringAsync().Result); break; //Throttling, timeouts case HttpStatusCode.TooManyRequests: case HttpStatusCode.GatewayTimeout: retry = true; break; //Some other error occured, so stop calling the API default: retry = false; break; } retries++; } while (retry && retries < MAX_RETRIES); }
GitHubrepositorio
Para obtener una implementación completa de la arquitectura de ejemplo para este patrón, consulteGitHubrepositorio enhttps://github.com/aws-samples/retry-with-backoff
Contenido relacionado
-
Tiempos de espera, reintentos y tiempos de espera por fluctuación
(Biblioteca de Amazon Builders)