Saltar al contenido

Aplicación Spring Boot: ¿cuál es el tiempo de espera predeterminado para cualquier punto final de la API de descanso o una configuración fácil para controlar el tiempo de espera de todos los puntos finales?

Solución:

Puedes probar server.connection-timeout=5000 en su application.properties. De la documentación oficial:

server.connection-timeout = # Tiempo en milisegundos que los conectores esperarán otra solicitud HTTP antes de cerrar la conexión. Cuando no se establece, se utilizará el valor predeterminado específico del contenedor del conector. Utilice un valor de -1 para indicar que no hay tiempo de espera (es decir, infinito).

ACTUALIZACIÓN: Acabo de notar que usa arquitectura de microservicio, por lo que en caso de que necesite manejar tiempos de espera cuando se comunica entre microservicios, sugeriría manejarlo en el lado del cliente en lugar del lado del servidor. Si el microservicio al que intenta llamar está sobrecargado y su rendimiento se degrada hasta el punto en que afecta drásticamente la experiencia del usuario, a veces es mejor devolver algunos datos de respaldo que simplemente descartar la solicitud.

Imagine que tenemos un sitio web de comercio electrónico que tiene una arquitectura de microservicios y uno de sus microservicios que da recomendaciones al usuario se vuelve extremadamente lento. En este caso, la solución preferida sería devolver algunos datos de respaldo que podrían ser los 10 productos más populares de este mes en lugar de mostrar la página de error 5xx al cliente. Además, en caso de que las solicitudes posteriores fallen con un tiempo de espera, podemos tomar una decisión para evitar enviar solicitudes al ‘servicio de recomendación’ y devolver los datos de respaldo de inmediato. Después de un tiempo, podemos intentar enviar una solicitud al ‘servicio de recomendación’ nuevamente, y si se volvió saludable, simplemente utilícelo en lugar de los datos de respaldo.

Se llama Cortacircuitos patrón y ya existe una implementación del mismo en un marco llamado Hystrix. Aquí hay un buen artículo que lo explica en profundidad: http://www.baeldung.com/spring-cloud-netflix-hystrix. Spring Cloud Feign + Spring Cloud Hystrix se ve muy bien, especialmente teniendo en cuenta que funcionan con los servicios de Discovery listos para usar (por ejemplo, Spring Cloud Eureka).

Estoy de acuerdo con todas las opciones anteriores y probé la opción siguiente en mi aplicación de arranque de primavera. Funciona perfectamente bien ahora. A continuación se muestra el ejemplo de código como un bean. Ahora solo necesito @Autowire RestTemplate donde quiera(java class) Lo necesito.

   @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        ((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setConnectTimeout(15000);
        ((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setReadTimeout(15000);

        return restTemplate;
    }

Hay un par de formas de hacer esto:

1) Utilizando ClientHttpRequestFactory con RestTemplate:

public RestTemplate restTemplate() {
    return new RestTemplate(clientHttpRequestFactory());
}

private ClientHttpRequestFactory clientHttpRequestFactory() {
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
    factory.setReadTimeout(timeinMillis);
    factory.setConnectTimeout(timeinMillis);
    return factory;
}

2) La segunda forma es usar callable, pero supongo que ya ha explorado esa solución.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *