Patrón de reintento con retroceso - AWS Guía prescriptiva

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.

Patrón de reintento con retroceso

Intención

El patrón de reintento con retroceso mejora la estabilidad de la aplicación al reintentar de manera transparente las operaciones con fallas debido a errores transitorios.

Motivación

En las arquitecturas distribuidas, los errores transitorios podrían deberse a la limitación del servicio, la pérdida temporal de la conectividad de la red o la no disponibilidad temporal del servicio. Reintentar de manera automática las operaciones con fallas debido a estos errores transitorios mejora la experiencia del usuario y la resiliencia de las aplicaciones. Sin embargo, los reintentos frecuentes pueden sobrecargar el ancho de banda de la red y provocar una contención. El retroceso exponencial es una técnica en la que las operaciones se reintentan mediante el aumento de los tiempos de espera para un número específico de reintentos.

Aplicabilidad

Utilice el patrón de reintento con retroceso cuando suceda lo siguiente:

  • Los servicios suelen limitar las solicitudes para evitar la sobrecarga, lo que se traduce en una excepción al proceso de llamada 429: demasiadas solicitudes.

  • La red es un participante invisible en las arquitecturas distribuidas, y los problemas temporales de la red provocan fallas.

  • El servicio al que se llama no está disponible de manera temporal, lo que provoca errores. Los reintentos frecuentes pueden provocar una degradación del servicio, a menos que se indique un tiempo de espera mediante este patrón.

Problemas 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 se utiliza el patrón de reintento con retroceso. De lo contrario, las actualizaciones parciales podrían dañar el estado del sistema.

  • Ancho de banda de la red: se puede producir una degradación del servicio si demasiados reintentos ocupan el ancho de banda de la red, lo que reduce los tiempos de respuesta.

  • Escenarios de respuesta rápida a los errores: en el caso de errores no transitorios, si se puede determinar la causa del error, es más eficiente responder rápido a los errores mediante el patrón de disyuntores.

  • Tasa de retroceso: la introducción de un retroceso exponencial puede repercutir en el tiempo de espera del servicio, lo que se traduce en tiempos de espera más largos para el usuario final.

Implementación

Arquitectura de alto nivel

En el diagrama siguiente se ilustra cómo el servicio A puede reintentar las llamadas al servicio B hasta obtener una respuesta correcta. Si el servicio B no devuelve una respuesta satisfactoria después de varios intentos, el servicio A puede dejar de reintentarlo y devolver un error al autor de la llamada.

Arquitectura general para los reintentos con patrón de retroceso

Implementación mediante los servicios de AWS

En el diagrama siguiente se muestra un flujo de trabajo del procesamiento de tickets en una plataforma de atención al cliente. Los tickets de los clientes insatisfechos se gestionan con mayor rapidez mediante el escalado automático de su prioridad. La función de Lambda Ticket info extrae los detalles del ticket y llama a la función de Lambda Get sentiment. La función de Lambda Get sentiment verifica las opiniones de los clientes al pasar la descripción a Amazon Comprehend (no se muestra).

Si se produce un error en la llamada a la función de Lambda Get sentiment, el flujo de trabajo vuelve a intentar la operación tres veces. AWS Step Functions permite el retroceso exponencial al permitirle configurar el valor del 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 reintento es correcto, se produce un error en el flujo de trabajo. Para la lógica de retroceso no es necesario ningún código personalizado. AWS Step Functions lo proporciona como una configuración.

Patrón de reintento con retroceso con los productos de AWS

Código de muestra

En el código siguiente se muestra la implementación del patrón de reintento con retroceso.

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); }

Repositorio GitHub

Para obtener una implementación completa de la arquitectura de ejemplo para este patrón, consulte el repositorio de GitHub en https://github.com/aws-samples/retry-with-backoff.

Contenido relacionado