Spring Boot

Gestión de errores 429 RateLimit con Spring WebClient

Recientemente me he hecho cargo del mantenimiento de un Spring Boot proyecto. Este proyecto tiene algunas Límite de tarifa errores en los registros cuando la aplicación se ponía en contacto con una API REST remota. Resulta que esta aplicación también utilizaba el método síncrono y bloqueante Plantilla RestTemplate para realizar las llamadas a la API, en lugar del más reciente Spring WebClientque resulta que utiliza la API Reactor bajo el capó.

¿Y sabes qué es lo mejor de Reactor y del uso de APIs Reactivas en general? Hace que programar con Data Stream sea muy fácil. Lo que también significa que facilita la implementación de estrategias de reintento.

Hablemos primero del error en el registro. Lo que obtuve se parecía a esto:

Como de costumbre, la parte interesante de las trazas de pila está en la parte superior. El error es 429 Demasiadas solicitudesy el mensaje dice que hay un Límite de velocidad de 1 minuto. Descomponiendo esto, el estado HTTP el código devuelto es 429. Se trata de un error de límite de velocidad, lo que significa que la API indica a la persona que llama que ha enviado demasiadas peticiones. Por lo general, esto se puede resolver esperando un poco, e incluso podría tener un Reintentar después de en la respuesta que le indica cuánto tiempo tiene que esperar.

Veamos cómo podemos obtener esa información con WebClient de Spring:

Este código está enviando un GET petición. El WebClient nos permite echar un vistazo a la respuesta de la petición y reaccionar adecuadamente gracias a la función onStatus método. El primer parámetro es un booleano utilizado para filtrar el código de estado HTTP devuelto. Aquí, cuando el código de estado es 429, hacemos algo.

Echamos un vistazo a la Respuesta mirar si hay un Reintentar después de si es así, inicializamos la cabecera delayInSeconds si no, establecemos un valor por defecto de 60. Entonces podemos devolver el Respuesta asignado a un RateLimitException. El contenido del cuerpo se utilizará como mensaje de error y el delayInSeconds estará disponible en un campo separado. Echa un vistazo al código de Excepción para más detalles:

Así que lo que hay que hacer es capturar este error específico y luego volver a intentarlo después de la duración dada. Reactor lo hace fácil proporcionando Reintentos estrategias. Todo lo que tiene que hacer es llamar al reintentarCuando método:

Existen diferentes Reintentar podemos utilizar el método withThrowable() constructor. Da un Flux que debe contener el RateLimitException. Así que empezamos aplicando un filtro para asegurarnos de ello. Luego mapeamos esa excepción al objeto Retry real. Aquí es el Retry.fixedDelay tomando como parámetros un máximo de intentos y una duración. La duración procede del RateLimitException que se lanzó antes.

Con eso, cada vez que una petición devuelva un 429, el cliente esperará el tiempo apropiado hasta que reintente. Y fue mucho más fácil de implementar con Reactor que usando try/catch con Spring's Plantilla RestTemplate. Sé que la programación reactiva puede ser un poco intimidante al principio, pero es una gran manera de gestionar flujos de datos como solicitudes y respuestas HTTP, o para gestionar las conexiones a bases de datos que soportan la programación reactiva, como Couchbase.

¿Quieres más ayuda e ideas?

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Author

Posted by Laurent Doguin

Laurent es un metalero empollón que vive en París. Principalmente escribe código en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programación reactiva y otras cosas de moda. También fue Developer Advocate de Clever Cloud y Nuxeo, donde dedicó su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en Couchbase.

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.