J'ai développé un microservice en utilisant Spring Boot. Je testais les performances du service en écrasant les appels dorsaux. Lorsque je regarde le nombre de threads, je constate que le nombre maximal de threads créés pour le service est de 20 à tout moment, même si le nombre d'appels effectués est beaucoup plus élevé. Existe-t-il des limites en ce qui concerne le nombre d'appels pouvant être effectués vers un microservice développé à l'aide de Spring Boot? Pouvez-vous indiquer les étapes à suivre pour résoudre/augmenter le nombre de connexions acceptées par le service?
Ce paramètre est dérivé du conteneur intégré (Tomcat, Jetty ...).
Nombre de threads de Tomcat
Vous pouvez spécifier cette propriété dans votre application.properties
server.Tomcat.max-threads=400
Vous dites que vous avez compté 20 threads, mais selon ce autre question/réponse de stackoverflow , le nombre de threads par défaut devrait être 200 avec Tomcat, puisque la valeur par défaut de server.Tomcat.max-threads est 0. Voir - documentation de Tomcat :
Nombre maximal de threads de traitement de demandes à créer par ce connecteur, ce qui détermine donc le nombre maximal de demandes simultanées pouvant être traitées. S'il n'est pas spécifié, cet attribut est défini sur 200. Si un exécuteur est associé à ce connecteur, cet attribut est ignoré car le connecteur exécutera des tâches à l'aide de l'exécuteur plutôt que d'un pool de threads interne.
En outre, la propriété pour:
ressorts : server.undertow.worker-threads
jetée : server.jetty.acceptors
Vous trouverez la liste des propriétés dans la documentation de Spring
Bien que la réponse acceptée soit très utile, j’ai récemment fait l'expérience de ce que je considère être le même problème que l'affiche originale. C'est le seul résultat de recherche que j'ai pu trouver qui soit directement corrélé à mon expérience, alors j'ai pensé ajouter ma solution au cas où cela aiderait quelqu'un.
Dans mon cas, la limite de simultanéité observée de 20 a été imposée par le paramètre par défaut de 20 pour la propriété maxConcurrentStreamExecution
dans org.Apache.coyote.http2.Http2Protocol
.
Si vous rencontrez ce problème et que vous utilisez HTTP/2, il est fort probable que l'augmentation de maxConcurrentStreamExecution
vous aidera.
Vous pouvez trouver plus d’informations dans Référence de configuration Tomcat , qui indique en fait que cette valeur doit être définie sur 200 par défaut (et non sur 20). Vous pouvez certainement voir le réglage par défaut de 20 dans org.Apache.coyote.http2.Http2Protocol
, cependant, donc je ne suis pas sûr s'il s'agit d'une faute de frappe ou simplement quelque chose qui se présente différemment dans la version intégrée de Tomcat.
Peut-être que vous pouvez jeter un oeil à la config de springboot
server.Tomcat.accept-count=100 # Maximum queue length for incoming connection requests when all possible request processing threads are in use.
server.Tomcat.additional-tld-skip-patterns= # Comma-separated list of additional patterns that match jars to ignore for TLD scanning.
server.Tomcat.background-processor-delay=10s # Delay between the invocation of backgroundProcess methods. If a duration suffix is not specified, seconds will be used.
server.Tomcat.basedir= # Tomcat base directory. If not specified, a temporary directory is used.
server.Tomcat.max-connections=10000 # Maximum number of connections that the server accepts and processes at any given time.
server.Tomcat.max-http-header-size=0 # Maximum size in bytes of the HTTP message header.
server.Tomcat.max-http-post-size=2097152 # Maximum size in bytes of the HTTP post content.
server.Tomcat.max-threads=200 # Maximum amount of worker threads.
server.Tomcat.min-spare-threads=10 # Minimum amount of worker threads.
server.Tomcat.port-header=X-Forwarded-Port # Name of the HTTP header used to override the original port value.
server.Tomcat.protocol-header= # Header that holds the incoming protocol, usually named "X-Forwarded-Proto".
server.Tomcat.protocol-header-https-value=https # Value of the protocol header indicating whether the incoming request uses SSL.
server.Tomcat.redirect-context-root=true # Whether requests to the context root should be redirected by appending a / to the path.
server.Tomcat.remote-ip-header= # Name of the HTTP header from which the remote IP is extracted. For instance, `X-FORWARDED-FOR`.
server.Tomcat.resource.cache-ttl= # Time-to-live of the static resource cache.
server.Tomcat.uri-encoding=UTF-8 # Character encoding to use to decode the URI.
server.Tomcat.use-relative-redirects= # Whether HTTP 1.1 and later location headers generated by a call to sendRedirect will use relative or absolute redirects.
Augmentez maxConcurrentStreamExecution
(ensemble 200) pour HTTP/2 dans 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));
}
});
}
};
}
Si vous avez un actionneur, vous pouvez voir les métriques
/actuator/metrics/Tomcat.threads.config.max
{
"name": "Tomcat.threads.config.max",
"description": null,
"baseUnit": null,
"measurements": [{
"statistic": "VALUE",
"value": 200.0
}],
"availableTags": [{
"tag": "name",
"values": ["http-nio-8080"]
}]
}
La valeur réelle que Tomcat a décidé de créer? /actuator/metrics/Tomcat.threads.current
vous pouvez y voir 10 en fonction de la charge