SpringBoot内置Tomcat,在默认设置中,Tomcat的最大线程数是200,最大连接数是10000。支持的并发量是指连接数,也就是说 支持最大并发量是一万(默认)


Tomcat有两种处理连接的模式,
1,是BIO,一个线程只处理一个Socket连接,
2,是NIO,一个线程处理多个Socket连接。
由于HTTP请求不会太耗时,而且多个连接一般不会同时来消息,所以一个线程处理多个连接没有太大问题。一个线程处理多个连接数会很慢 有可能会超时


默认内嵌Tomcat配置:

server.tomcat.accept-count:等待队列长度,当可分配的线程数全部用完之后,后续的请求将进入等待队列等待,等待队列满后则拒绝处理,默认100。
server.tomcat.max-connections:最大可被连接数,默认10000
server.tomcat.max-threads:最大工作线程数,默认200,
server.tomcat.min-spare-threads:最小工作线程数,初始化分配线程数,默认10

默认配置下,连接超过10000后会出现拒绝连接情况

默认配置下,触发的请求超过200+100后拒绝处理(最大工作线程数+等待队列长度)


如果默认配置无法满足当前需求 可以自己调优 可以手动修改配置来进行处理并发
修改pro文件


server.port=7001

server.tomcat.accept-count=1000

server.tomcat.max-connections=10000

server.tomcat.max-threads=500

server.tomcat.min-spare-threads=100

然后 打包重启项目

kill -9 9545   //杀死进程
ps -ef | grep java   //查看项目启动的端口
pstree -p 7968 | wc -l    //查看进程数

我们也可以使用配置文件, 可以新增WebServerConfiguration.java文件


import org.apache.catalina.connector.Connector;

import org.apache.coyote.http11.Http11NioProtocol;

import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;

import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;

import org.springframework.boot.web.server.ConfigurableWebServerFactory;

import org.springframework.boot.web.server.WebServerFactoryCustomizer;

import org.springframework.stereotype.Component;


//当Spring容器内没有TomcatEmbeddedServletContainerFactory这个bean时,会吧此bean加载进spring容器中

@Component

public class WebServerConfiguration implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {

    @Override

    public void customize(ConfigurableWebServerFactory configurableWebServerFactory) {

            //使用对应工厂类提供给我们的接口定制化我们的tomcat connector

        ((TomcatServletWebServerFactory)configurableWebServerFactory).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);

            }

        });

    }

}

备注:
MySQL 数据库 QPS 容量问题:

主键查询: 千万级别数据 == 1-10 ms
唯一索引查询: 千万级别数据 == 10-100 ms
非唯一索引查询: 千万级别数据 == 100-1000ms
无索引数据: 百万级别数据 == 1000ms+
MySQL 数据库 TPS 容量问题:

非插入的更新删除操作: 同查询
插入操作: 1w~10w tps(依赖配置优化)

原文链接:https://blog.csdn.net/yin__ren/article/details/93331528

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐