what springboot pivotal guide foundry for certification java spring spring-boot pivotal-cloud-foundry

java - pivotal - springboot guide



Spring Boot-Límite en el número de conexiones creadas (4)

Aumente maxConcurrentStreamExecution (set 200) para HTTP / 2 en Spring Boot 2:

@Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> containerCustomizer() { return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() { @Override public void customize(TomcatServletWebServerFactory factory) { factory.addConnectorCustomizers(new TomcatConnectorCustomizer() { @Override public void customize(Connector connector) { Arrays.stream(connector.getProtocolHandler().findUpgradeProtocols()) .filter(upgradeProtocol -> upgradeProtocol instanceof Http2Protocol) .map(upgradeProtocol -> (Http2Protocol) upgradeProtocol) .forEach(http2Protocol -> http2Protocol.setMaxConcurrentStreamExecution(200)); } }); } }; }

Desarrollé un microservicio utilizando Spring Boot. Estaba realizando pruebas de rendimiento del servicio al detener las llamadas internas. Cuando observé el recuento de hilos, veo que el número máximo de hilos que se crearon para el servicio es 20 en cualquier momento, aunque el número de llamadas realizadas sea mucho mayor. ¿Existe alguna limitación con respecto a la cantidad de llamadas que se pueden realizar a un microservicio desarrollado utilizando Spring Boot? ¿Puede orientarme sobre los pasos que debo seguir para solucionar o aumentar el número de conexiones aceptadas por el servicio?


Esta configuración se deriva del contenedor incrustado (tomcat, jetty ...).

Número de hilos de Tomcat

Puede especificar esta propiedad en su application.properties

server.tomcat.max-threads=400

Dice que contó 20 hilos, sin embargo, de acuerdo con esta otra pregunta / respuesta de , el número predeterminado de hilos debería ser 200 con tomcat, ya que el valor predeterminado de server.tomcat.max-threads es 0. Consulte la documentación de tomcat :

El número máximo de subprocesos de procesamiento de solicitud que creará este Conector, que por lo tanto determina el número máximo de solicitudes simultáneas que se pueden manejar. Si no se especifica, este atributo se establece en 200. Si un ejecutor está asociado con este conector, este atributo se ignora, ya que el conector ejecutará tareas utilizando el ejecutor en lugar de un grupo de subprocesos interno.

Además, la propiedad para:

  • server.undertow.worker-threads : server.undertow.worker-threads

  • embarcadero : server.jetty.acceptors

Encontrarás la lista de propiedades en la documentación de Spring.


Si bien la respuesta aceptada es muy útil, recientemente experimenté lo que creo que es el mismo problema que el póster original. Este es el único resultado de búsqueda que pude encontrar directamente relacionado con mi experiencia, así que pensé en agregar mi solución en caso de que ayude a alguien.

En mi caso, el límite de concurrencia observado de 20 fue impuesto por la configuración predeterminada de 20 para la propiedad maxConcurrentStreamExecution en org.apache.coyote.http2.Http2Protocol .

Si está experimentando este problema y está usando HTTP / 2, existe una buena posibilidad de que el aumento de maxConcurrentStreamExecution ayude.

Puede encontrar más información en la Referencia de configuración de Tomcat , que en realidad establece que esto debe establecerse en 200 por defecto (no 20). Sin embargo, definitivamente puede ver la configuración predeterminada de 20 en org.apache.coyote.http2.Http2Protocol , así que no estoy seguro de que sea un error tipográfico o simplemente algo que se presente de manera diferente en la versión integrada de Tomcat.


Tomcat - maxThreads vs maxConnections

Intente establecer la propiedad maxConnections para que sea más de 10000.

Desde el doc :

El número máximo de conexiones que el servidor aceptará y procesará en un momento dado. Cuando se haya alcanzado este número, el servidor aceptará, pero no procesará, una conexión adicional. Esta conexión adicional se bloqueará hasta que el número de conexiones que se procesen sea inferior a maxConnections, momento en el que el servidor comenzará a aceptar y procesar nuevas conexiones nuevamente. Tenga en cuenta que una vez que se haya alcanzado el límite, el sistema operativo aún puede aceptar conexiones según la configuración de acceptCount. El valor predeterminado varía según el tipo de conector. Para BIO, el valor predeterminado es el valor de maxThreads, a menos que se utilice un Ejecutor, en cuyo caso el valor predeterminado será el valor de maxThreads desde el ejecutor. Para NIO, el valor predeterminado es 10000 . Para APR / native, el valor predeterminado es 8192 .

Tenga en cuenta que para APR / nativo en Windows, el valor configurado se reducirá al múltiplo más alto de 1024 que sea menor o igual que maxConnections. Esto se hace por razones de rendimiento. Si se establece en un valor de -1, la función maxConnections se desactiva y las conexiones no se cuentan.

Hay unas propiedades para el arranque por resorte, tomcat max-connection, que deben configurarse en el archivo application.properties

server.tomcat.max-connections= # Maximum number of connections that the server will accept and process at any given time.

Más información visita here , here y aquí.