spring cloud - tutorial - Zuul agota el tiempo en solicitudes largas
spring-cloud-starter-netflix-zuul (7)
Estoy usando una aplicación en la nube de front-end (micro servicio) que actúa como un proxy zuul (@EnableZuulProxy) para enrutar las solicitudes desde una fuente externa a otros micro servicios internos escritos usando la nube de primavera (arranque de primavera).
El servidor zuul sale directamente de las aplicaciones en la sección de muestras
@SpringBootApplication
@Controller
@EnableZuulProxy
@EnableDiscoveryClient
public class ZuulServerApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(ZuulServerApplication.class).web(true).run(args);
}
}
Ejecuté este conjunto de servicios localmente y todo parece funcionar bien, pero si lo ejecuto en una red con cierta carga o a través de una VPN, entonces empiezo a ver los errores de reenvío de zuul, que veo como tiempos de espera del cliente en los registros
¿Hay alguna forma de cambiar el tiempo de espera en los forwards zuul para que pueda eliminar este problema de mis preocupaciones inmediatas? ¿Qué configuración de parámetros accesibles hay para esto?
Estoy en medio de un lanzamiento y esto acaba de aparecer :)
En mi caso, tuve que cambiar la siguiente propiedad:
zuul.host.socket-timeout-millis=30000
Esto funcionó para mí, tuve que establecer la conexión y el tiempo de espera del socket en la application.yml
:
zuul:
host:
connect-timeout-millis: 60000 # starting the connection
socket-timeout-millis: 60000 # monitor the continuous incoming data flow
He experimentado el mismo problema: en solicitudes largas, el comando hystrix de Zuul mantuvo el tiempo de espera después de alrededor de un segundo a pesar de establecer ribbon.ReadTimeout=10000
.
Lo resolví desactivando los tiempos de espera por completo:
hystrix:
command:
default:
execution:
timeout:
enabled: false
Una alternativa que también funciona es cambiar la estrategia de aislamiento Hystrix de Zuul a THREAD:
hystrix:
command:
default:
execution:
isolation:
strategy: THREAD
thread:
timeoutInMilliseconds: 10000
Las propiedades para establecer son: ribbon.ReadTimeout
en general y <service>.ribbon.ReadTimeout
para un servicio específico, en milisegundos. La wiki de Ribbon tiene algunos ejemplos. Este javadoc tiene los nombres de las propiedades.
Si Zuul utiliza el descubrimiento de servicios, debe configurar estos tiempos de espera con las ribbon.ReadTimeout
y ribbon.SocketTimeout
Ribbon.
Si ha configurado rutas Zuul especificando URL, necesita usar zuul.host.connect-timeout-millis
y zuul.host.socket-timeout-millis
por rutas me refiero
zuul:
routes:
dummy-service:
path: /dummy/**
Solo estas configuraciones en application.yml
funcionaron para mí:
ribbon:
ReadTimeout: 90000
ConnectTimeout: 90000
eureka:
enabled: true
zuul:
host:
max-total-connections: 1000
max-per-route-connections: 100
semaphore:
max-semaphores: 500
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 1000000
Espero que ayude a alguien!
Tuve que modificar dos tiempos de espera para obligar a zuul a detener el tiempo de solicitudes de larga ejecución. Incluso si los tiempos de espera de hystrix están desactivados, la cinta aún expirará.
hystrix:
command:
default:
execution:
timeout:
enabled: false
ribbon:
ReadTimeout: 100000
ConnectTimeout: 100000