우리 모두는 SpringBoot의 기본 내장 컨테이너가 Tomcat이라는 것을 알고 있습니다. 이는 우리 프로그램이 실제로 Tomcat에서 실행된다는 의미입니다. 따라서 SpringBoot가 얼마나 많은 요청을 처리할 수 있는지가 아니라 Tomcat이 얼마나 많은 요청을 처리할 수 있는지가 중요합니다.
Tomcat의 기본 구성은 spring-configuration-metadata.json
파일에 있고 해당 구성 클래스는 org.springframework.boot.autoconfigure.web.ServerProperties
입니다. . spring-configuration-metadata.json
文件中,对应的配置类则是org.springframework.boot.autoconfigure.web.ServerProperties
。
和处理请求数量相关的参数有四个:
server.tomcat.threads.min-spare:最少的工作线程数,默认大小是10。该参数相当于长期工,如果并发请求的数量达不到10,就会依次使用这几个线程去处理请求。server.tomcat.threads.max:最多的工作线程数,默认大小是200。该参数相当于临时工,如果并发请求的数量在10到200之间,就会使用这些临时工线程进行处理。server.tomcat.max-connections:最大连接数,默认大小是8192。表示Tomcat可以处理的最大请求数量,超过8192的请求就会被放入到等待队列。
server.tomcat.accept-count:等待队列的长度,默认大小是100。
举个例子说明一下这几个参数之间的关系:
如果把Tomcat比作一家饭店的话,那么一个请求其实就相当于一位客人。min-spare就是厨师(长期工);max是厨师总数(长期工+临时工);max-connections就是饭店里的座位数量;accept-count是门口小板凳的数量。来的客人优先坐到饭店里面,然后厨师开始忙活,如果长期工可以干的完,就让长期工干,如果长期工干不完,就再让临时工干。图中画的厨师一共15人,饭店里有30个座位,也就是说,如果现在来了20个客人,那么就会有5个人先在饭店里等着。如果现在来了35个人,饭店里坐不下,就会让5个人先到门口坐一下。如果来了50个人,那么饭店座位+门口小板凳一共40个,所以就会有10人离开。
也就是说,SpringBoot同时所能处理的最大请求数量是max-connections+accept-count
관련 처리된 요청 수에 4개의 매개변수가 있습니다:
server.tomcat.threads.min-spare
: 최소 작업자 스레드 수, 기본 크기는 10입니다. 이 매개변수는 장기 작업자와 동일합니다. 동시 요청 수가 10에 도달하지 않으면 이러한 스레드가 요청을 처리하는 데 순차적으로 사용됩니다.server.tomcat.threads.max
: 최대 작업자 스레드 수, 기본 크기는 200입니다. 이 매개변수는 임시 작업자와 동일합니다. 동시 요청 수가 10~200이면 이러한 임시 작업자 스레드가 처리에 사용됩니다.server.tomcat.max-connections
: 최대 연결 수, 기본 크기는 8192입니다. Tomcat이 처리할 수 있는 최대 요청 수를 나타냅니다. 8192를 초과하는 요청은 대기 대기열에 배치됩니다.server.tomcat.accept-count: 대기 대기열의 길이, 기본 크기는 100입니다.
다음 매개변수 간의 관계를 설명하는 예를 들어보세요.
Tomcat을 레스토랑에 비유하면 실제로 하나의 요청은 손님과 동일합니다. min-spare는 셰프(정규 직원)이고, max는 총 셰프 수(정규 직원 + 임시 직원)입니다. max-connections는 레스토랑의 좌석 수입니다. . 오시는 손님은 우선 식당에 앉으시고, 주방장이 일을 시작합니다. 장기근로자가 일을 끝낼 수 있으면 장기근로자가 일을 마치지 못하게 하세요. , 임시 직원에게 맡기십시오. 사진 속 셰프는 15명이고, 레스토랑 좌석은 30명입니다. 즉, 지금 손님이 20명이 오면 먼저 레스토랑에 5명이 기다리고 있다는 뜻입니다. 지금 35명이 왔는데 식당에 자리가 없으면 5명 먼저 문 앞에 앉으라고 합니다. 50명이 오면 호텔에 40석 + 문 앞에 작은 벤치가 있으니 10명은 나가게 됩니다.즉, SpringBoot가 동시에 처리할 수 있는 최대 요청 수는 max-connections+accept-count
입니다. 이 수를 초과하는 요청은 바로 삭제됩니다.
종이상으로는 이 일을 단계별로 해야 한다는 것을 마침내 깨달았습니다.
위 내용은 단지 이론적인 결과일 뿐입니다. 이제 작은 실제 예를 사용하여 이것이 사실인지 보여드리겠습니다.
SpringBoot 프로젝트를 만들고 application.yml에서 이러한 매개 변수를 구성합니다. 기본 숫자가 너무 크지 않기 때문입니다. 테스트하기 쉬우므로 구성이 더 작습니다. server:
tomcat:
threads:
# 最少线程数
min-spare: 10
# 最多线程数
max: 15
# 最大连接数
max-connections: 30
# 最大等待数
accept-count: 10
간단한 인터페이스를 다시 작성해 보겠습니다. @GetMapping("/test")
public Response test1(HttpServletRequest request) throws Exception {
log.info("ip:{},线程:{}", request.getRemoteAddr(), Thread.currentThread().getName());
Thread.sleep(500);
return Response.buildSuccess();
}
코드는 매우 간단합니다. 스레드 이름을 인쇄한 다음 0.5초 동안 대기합니다. 한 번에 처리됩니다.
设想有以下场景:厨师们用一个账本记录一共做了多少道菜,每个厨师做完菜都记录一下,每次记录都是将账本上的数字先抄到草稿纸上,计算x+1等于多少,然后将计算的结果写回到账本上。
Spring容器中的Bean默认是单例的,也就是说,处理请求的Controller、Service实例就只有一份。在并发场景下,将cookSum定义为全局变量,是所有线程共享的,当一个线程读到了cookSum=20,然后计算,写回前另一个线程也读到是20,两个线程都加1后写回,最终cookSum就变成了21,但是实际上应该是22,因为加了两次。
private int cookSum = 0; @GetMapping("/test") public Response test1(HttpServletRequest request) throws Exception { // 做菜。。。。。。 cookSum += 1; log.info("做了{}道菜", cookSum); Thread.sleep(500); return Response.buildSuccess(); }
위 내용은 SpringBoot는 동시에 몇 개의 요청을 처리할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!