>  기사  >  Java  >  SpringBoot는 동시에 몇 개의 요청을 처리할 수 있나요?

SpringBoot는 동시에 몇 개의 요청을 처리할 수 있나요?

PHPz
PHPz앞으로
2023-05-15 15:22:121234검색

Text

우리 모두는 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

SpringBoot는 동시에 몇 개의 요청을 처리할 수 있나요?

和处理请求数量相关的参数有四个:

SpringBoot는 동시에 몇 개의 요청을 처리할 수 있나요?

  • 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。

举个例子说明一下这几个参数之间的关系:

SpringBoot는 동시에 몇 개의 요청을 처리할 수 있나요?

如果把Tomcat比作一家饭店的话,那么一个请求其实就相当于一位客人。min-spare就是厨师(长期工);max是厨师总数(长期工+临时工);max-connections就是饭店里的座位数量;accept-count是门口小板凳的数量。来的客人优先坐到饭店里面,然后厨师开始忙活,如果长期工可以干的完,就让长期工干,如果长期工干不完,就再让临时工干。图中画的厨师一共15人,饭店里有30个座位,也就是说,如果现在来了20个客人,那么就会有5个人先在饭店里等着。如果现在来了35个人,饭店里坐不下,就会让5个人先到门口坐一下。如果来了50个人,那么饭店座位+门口小板凳一共40个,所以就会有10人离开。

也就是说,SpringBoot同时所能处理的最大请求数量是max-connections+accept-count

SpringBoot가 동시에 처리할 수 있는 요청 수

관련 처리된 요청 수에 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-countSpringBoot는 동시에 몇 개의 요청을 처리할 수 있나요?: 대기 대기열의 길이, 기본 크기는 100입니다.

다음 매개변수 간의 관계를 설명하는 예를 들어보세요.

SpringBoot가 동시에 처리할 수 있는 요청 수SpringBoot는 동시에 몇 개의 요청을 처리할 수 있나요?

Tomcat을 레스토랑에 비유하면 실제로 하나의 요청은 손님과 동일합니다. min-spare는 셰프(정규 직원)이고, max는 총 셰프 수(정규 직원 + 임시 직원)입니다. max-connections는 레스토랑의 좌석 수입니다. . 오시는 손님은 우선 식당에 앉으시고, 주방장이 일을 시작합니다. 장기근로자가 일을 끝낼 수 있으면 장기근로자가 일을 마치지 못하게 하세요. , 임시 직원에게 맡기십시오. 사진 속 셰프는 15명이고, 레스토랑 좌석은 30명입니다. 즉, 지금 손님이 20명이 오면 먼저 레스토랑에 5명이 기다리고 있다는 뜻입니다. 지금 35명이 왔는데 식당에 자리가 없으면 5명 먼저 문 앞에 앉으라고 합니다. 50명이 오면 호텔에 40석 + 문 앞에 작은 벤치가 있으니 10명은 나가게 됩니다.

즉, SpringBoot가 동시에 처리할 수 있는 최대 요청 수는 max-connections+accept-count입니다. 이 수를 초과하는 요청은 바로 삭제됩니다.

종이상으로는 이 일을 단계별로 해야 한다는 것을 마침내 깨달았습니다. SpringBoot는 동시에 몇 개의 요청을 처리할 수 있나요?

위 내용은 단지 이론적인 결과일 뿐입니다. 이제 작은 실제 예를 사용하여 이것이 사실인지 보여드리겠습니다.

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초 동안 대기합니다. 한 번에 처리됩니다.

그런 다음 Apifox를 사용하여 100개의 요청을 시뮬레이션하는 테스트 사례를 만들었습니다.

🎜🎜테스트 결과를 관찰합니다. 🎜🎜🎜🎜🎜결과에서 볼 수 있듯이 🎜max-connections+accept- The 설정으로 인해 count of count🎜의 합은 40이므로 60개의 요청이 삭제되며 이는 우리의 예상과 일치합니다. 최대 스레드는 15개이므로 먼저 25개의 요청을 대기한 후 처음 15개를 처리한 후 15개를 처리하고 최종적으로 10개를 처리합니다. 즉, 40개의 요청을 3개의 배치로 나눕니다. 15, 15, 10. 다루세요. 🎜🎜🎜🎜🎜콘솔 인쇄 로그에서 최대 스레드 수가 15인 것을 볼 수 있는데, 이는 이전 아이디어도 확인시켜 줍니다. 🎜🎜🎜요약하자면🎜: 동시 요청 수가 🎜server.tomcat.threads.max🎜보다 적으면 즉시 처리되며, 최대 개수의 합을 초과하면 초과된 요청을 먼저 기다립니다. 연결 및 승인 횟수, 초과 부분은 직접 삭제됩니다. 🎜🎜확장: 동시성 문제가 발생하는 방식🎜🎜지금까지 SpringBoot가 동시에 처리할 수 있는 요청 수를 알아냈습니다. 하지만 여기서는 위의 예를 기반으로 확장하고 싶습니다. 동시 시나리오의 일부 값이 예상한 것과 다른 이유는 무엇입니까? 🎜

设想有以下场景:厨师们用一个账本记录一共做了多少道菜,每个厨师做完菜都记录一下,每次记录都是将账本上的数字先抄到草稿纸上,计算x+1等于多少,然后将计算的结果写回到账本上。

SpringBoot는 동시에 몇 개의 요청을 처리할 수 있나요?

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는 동시에 몇 개의 요청을 처리할 수 있나요?

위 내용은 SpringBoot는 동시에 몇 개의 요청을 처리할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제