Maison > Java > javaDidacticiel > le corps du texte

Comment intégrer la capacité de concurrence Tomcat dans SpringBoot

WBOY
Libérer: 2023-05-11 23:13:10
avant
1283 Les gens l'ont consulté

Trouvé un problème de conteneur simultané

Comment intégrer la capacité de concurrence Tomcat dans SpringBoot

Comment intégrer la capacité de concurrence Tomcat dans SpringBoot

Réalisation d'un test de stress de 6 000 threads sur une seule interface. Chaque thread a été demandé 5 fois. Le thread a été créé dans les 5 secondes. À mi-parcours, le temps de réponse à la requête était déjà atteint. Oversize s'est produit et son taux d'erreur a atteint 43%. Cette capacité simultanée est relativement faible pour les serveurs dotés de meilleures configurations.

Plongez dans la couche inférieure de SpringBoot pour comprendre la raison

La configuration des métadonnées est mentionnée dans la documentation officielle de SpringBoot

Comment intégrer la capacité de concurrence Tomcat dans SpringBoot

Vous pouvez voir que la configuration par défaut des ports de nos éléments de configuration les plus couramment utilisés fait partie eux.

Configuration Tomcat intégrée par défaut

1. server.tomcat.accept-count : longueur de la file d'attente lorsque le nombre de threads allouables est épuisé, les requêtes suivantes entreront dans la file d'attente pour attendre. Lorsque la file d'attente est pleine, traitement. sera refusé, par défaut 100.

2. server.tomcat.max-connections : le nombre maximum de connexions, la valeur par défaut est 10000

3 server.tomcat.max-threads : le nombre maximum de threads de travail, la valeur par défaut est 200,

4. server.tomcat.min- Spare-threads : le nombre minimum de threads de travail, le nombre de threads d'allocation initiale, la valeur par défaut est 10

Dans la configuration par défaut, la connexion sera refusée une fois que le nombre de connexions dépasse 10 000

Sous la configuration par défaut, les requêtes déclenchées seront rejetées après avoir dépassé 200+100 (nombre de travail maximum de threads + longueur de la file d'attente)

Ces métadonnées Spring fournissent bien sûr des fonctions de configuration externes

#更改内嵌tomcat参数
server.port=8080
## 等待队列长度,默认100。
server.tomcat.accept-count=1000
## 最大工作线程数,默认200。(4核8g内存,线程数经验值800,操作系统做线程之间的切换调度是有系统开销的,所以不是越多越好。)
server.tomcat.max-threads=800
## 最小工作空闲线程数,默认10。(适当增大一些,以便应对突然增长的访问量)
server.tomcat.min-spare-threads=100
Copier après la connexion

SpringBoot a intégré Tomcat In. les paramètres par défaut, le nombre maximum de threads de Tomcat est de 200 et le nombre maximum de connexions est de 10 000. Le niveau de concurrence pris en charge fait référence au nombre de connexions. Comment 200 threads peuvent-ils gérer 10 000 connexions ?

Actuellement, Tomcat dispose de trois modes de traitement des connexions. L'un est BIO, où un thread ne gère qu'une seule connexion, et l'autre est NIO, où un thread gère plusieurs connexions. Étant donné que les requêtes HTTP ne prennent pas trop de temps et que plusieurs connexions ne reçoivent généralement pas de messages en même temps, il n'y a pas de gros problème dans le traitement de plusieurs connexions avec un seul thread.

Il existe également le mode apr. Ces trois modes de Tomcat seront présentés en détail plus tard, et ne seront pas abordés en profondeur ici.

Lorsque Tomcat démarre, vous pouvez voir quel mode de fonctionnement le connecteur utilise via le journal :

Starting ProtocolHandler ["http-bio-8080"]
Starting ProtocolHandler ["http-nio-8080"]
Starting ProtocolHandler ["http-apr-8080"]
Copier après la connexion

La valeur par défaut peut être dans spring-boot-autoconfigure-version number.jar (par exemple : spring-boot-autoconfigure-2.1 .0.RELEASE), vous pouvez voir la configuration par défaut en décompressant et en décompilant le fichier /web/ServerProperties.class.

Comment intégrer la capacité de concurrence Tomcat dans SpringBoot

Développement Tomcat intégré personnalisé

Comment intégrer la capacité de concurrence Tomcat dans SpringBoot

À propos de KeepAlive

KeepAlive est activé par défaut dans les requêtes HTTP utilisant Jmeter

La requête KeepAlive de HTTP se produit lorsque notre client envoie HTTP à notre serveur Lors de la demande, si l'en-tête de requête KeepAlive est inclus, cela signifie que notre client Http espère établir une connexion KeepAlive avec le serveur. Le but correspondant de cette connexion est d'envoyer la réponse correspondante à notre serveur. Après cela, notre serveur ne doit pas se déconnecter immédiatement, mais attendre et essayer de le faire. réutiliser la connexion.

Cette solution est utilisée pour résoudre le problème fastidieux causé par la réponse HTTP, l'état sans état, la déconnexion et la nouvelle connexion à chaque fois.

Mais si nous maintenons une longue connexion avec le serveur après l'ouverture de chaque requête de page Web, le nombre de connexions sur notre serveur sera bientôt épuisé. Par conséquent, dans la première version HTTP 1.0, aucune requête KeepAlive n'était conçue. , mais la requête Http1.1 plus KeepAlive actuelle s'adresse à de plus en plus d'appareils mobiles, et même à certaines interactions de pages Web très complexes, qui nécessitent des requêtes fréquentes au serveur pendant le processus de navigation de l'utilisateur. Par conséquent, l'établissement d'une connexion KeepAlive n'est pas nécessaire. à des fins de tests de résistance, mais il présente en fait certains avantages en termes de performances dans les scénarios d'application. Qu'il s'agisse du client ou du serveur, lors de certaines interactions de communication réseau, il n'est pas nécessaire de créer une nouvelle connexion et de la déconnecter. Établissement d'une connexion TCP/IP, mais nécessite uniquement l'envoi de données.

Mais une telle conception posera également quelques problèmes. Si notre serveur n'impose aucune restriction sur le fonctionnement de KeepAlive 1. La connexion n'effectue aucune opération ni ne répond, alors cette connexion est pour le serveur One fee connection 2. Certains les attaquants utilisent de manière malveillante les connexions KeepAlive pour envoyer des attaques DDOS à notre serveur. La connexion correspondante sur le serveur ne deviendra qu'une porte dérobée pour les attaquants. Par conséquent, pour des raisons de sécurité, nous devons personnaliser le développement de Tomcat

Configuration

1. plusieurs millisecondes après lesquelles le client ne répond pas avant que KeepAlive soit déconnecté

2 maxKeepAliveRequests : combien de requêtes après lesquelles KeepAlive se déconnecte et expire

.

在SpringBoot官方文档中提到了对内嵌容器的配置

Comment intégrer la capacité de concurrence Tomcat dans SpringBoot

//当spring容器内没有TomcatEmbeddedServletContainerFactory这个bean时,会把bean加载进spring容器
@Configuration
public class WebServerConfiguration implements WebServerFactoryCustomizer<configurablewebserverfactory> {
@Override
public void customize(ConfigurableWebServerFactory factory) {
  //使用对应工厂类提供给我们的接口定制化我们的tomcat connector
  ((TomcatServletWebServerFactory)factory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
    @Override
    public void customize(Connector connector) {
      Http11NioProtocol protocol= (Http11NioProtocol) connector.getProtocolHandler();
      //定制KeepAliveTimeout,设置30秒内没有请求则服务器自动断开keepalive连接
      protocol.setKeepAliveTimeout(30000);
      //当客户端发送超过10000个请求则自动断开keepalive连接
      protocol.setMaxKeepAliveRequests(10000);
    }
  });
}
}</configurablewebserverfactory>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal