Table of Contents
Text
Extension: How concurrency problems arise
Home Java javaTutorial How many requests can SpringBoot handle at the same time?

How many requests can SpringBoot handle at the same time?

May 15, 2023 pm 03:22 PM
springboot

Text

We all know that the default embedded container of SpringBoot is Tomcat, which means that our program actually runs in Tomcat. So it's not so much how many requests SpringBoot can handle, but how many requests Tomcat can handle.

The default configuration of Tomcat is in the spring-configuration-metadata.json file, and the corresponding configuration class is org.springframework.boot.autoconfigure.web.ServerProperties .

How many requests can SpringBoot handle at the same time?

There are four parameters related to the number of requests processed:

How many requests can SpringBoot handle at the same time?

  • server.tomcat.threads.min-spare: The minimum number of worker threads, the default size is 10. This parameter is equivalent to a long-term worker. If the number of concurrent requests does not reach 10, these threads will be used in sequence to process the requests. server.tomcat.threads.max: The maximum number of worker threads, the default size is 200. This parameter is equivalent to a temporary worker. If the number of concurrent requests is between 10 and 200, these temporary worker threads will be used for processing. server.tomcat.max-connections: The maximum number of connections, the default size is 8192. Indicates the maximum number of requests that Tomcat can handle. Requests exceeding 8192 will be placed in the waiting queue.

  • server.tomcat.accept-count: The length of the waiting queue, the default size is 100.

Give an example to illustrate the relationship between these parameters:

How many requests can SpringBoot handle at the same time?

If you compare Tomcat to a restaurant, Then a request is actually equivalent to a guest. min-spare is the chef (permanent workers); max is the total number of chefs (permanent workers and temporary workers); max-connections is the number of seats in the restaurant; accept-count is the number of small benches at the door. Guests who come are given priority to sit in the restaurant, and then the chef starts to work. If the long-term worker can finish the job, let the long-term worker do it. If the long-term worker cannot finish the job, let the temporary worker do it. There are 15 chefs in the picture, and there are 30 seats in the restaurant. That is to say, if 20 guests come now, there will be 5 people waiting in the restaurant first. If 35 people come now and there is no room in the restaurant, 5 people will be asked to sit at the door first. If 50 people come, then there are 40 seats and small benches at the entrance of the hotel, so 10 people will leave.

In other words, the maximum number of requests that SpringBoot can handle at the same time is max-connections accept-count. Requests exceeding this number will be discarded directly.

I only know that this matter must be carried out in detail.

The above are just theoretical results. Now let’s use a small practical example to demonstrate whether this is the case:

Create a SpringBoot project and configure these in application.yml parameters, because the default number is too large and difficult to test, so set it smaller:

server:
  tomcat:
    threads:
      # 最少线程数
      min-spare: 10
      # 最多线程数
      max: 15
    # 最大连接数
    max-connections: 30
    # 最大等待数
    accept-count: 10
Copy after login

Let’s write a simple interface:

    @GetMapping("/test")
    public Response test1(HttpServletRequest request) throws Exception {
        log.info("ip:{},线程:{}", request.getRemoteAddr(), Thread.currentThread().getName());
        Thread.sleep(500);
        return Response.buildSuccess();
    }
Copy after login

The code is very simple, just print the thread name , and then sleep for 0.5 seconds. This will definitely cause some requests to be processed at once and enter the waiting queue.

Then I created a test case using Apifox to simulate 100 requests:

How many requests can SpringBoot handle at the same time?

Observe the test results:

How many requests can SpringBoot handle at the same time?

As can be seen from the results, since the sum of the set max-connections accept-count is 40, 60 requests will be discarded, which is consistent with our expectations. of. Since the maximum thread is 15, that is, 25 requests will be waited for first, and then 15 will be processed after the first 15 are processed, and finally 10 will be processed, that is, the 40 requests are divided into three batches of 15, 15, and 10. deal with.

How many requests can SpringBoot handle at the same time?

#You can see from the console print log that the maximum thread number is 15, which also confirms the previous idea.

To summarize: If the number of concurrent requests is lower than server.tomcat.threads.max, it will be processed immediately, and the excess will be waited first. If If the number exceeds the sum of max-connections and accept-count, the excess will be discarded directly.

Extension: How concurrency problems arise

So far, we have figured out how many requests SpringBoot can handle at the same time. But here I would like to extend it based on the above example, which is why some values ​​in concurrent scenarios are different from what we expected?

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

How many requests can SpringBoot handle at the same time?

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();
}
Copy after login

How many requests can SpringBoot handle at the same time?

The above is the detailed content of How many requests can SpringBoot handle at the same time?. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How Springboot integrates Jasypt to implement configuration file encryption How Springboot integrates Jasypt to implement configuration file encryption Jun 01, 2023 am 08:55 AM

Introduction to Jasypt Jasypt is a java library that allows a developer to add basic encryption functionality to his/her project with minimal effort and does not require a deep understanding of how encryption works. High security for one-way and two-way encryption. , standards-based encryption technology. Encrypt passwords, text, numbers, binaries... Suitable for integration into Spring-based applications, open API, for use with any JCE provider... Add the following dependency: com.github.ulisesbocchiojasypt-spring-boot-starter2. 1.1Jasypt benefits protect our system security. Even if the code is leaked, the data source can be guaranteed.

How to use Redis to implement distributed locks in SpringBoot How to use Redis to implement distributed locks in SpringBoot Jun 03, 2023 am 08:16 AM

1. Redis implements distributed lock principle and why distributed locks are needed. Before talking about distributed locks, it is necessary to explain why distributed locks are needed. The opposite of distributed locks is stand-alone locks. When we write multi-threaded programs, we avoid data problems caused by operating a shared variable at the same time. We usually use a lock to mutually exclude the shared variables to ensure the correctness of the shared variables. Its scope of use is in the same process. If there are multiple processes that need to operate a shared resource at the same time, how can they be mutually exclusive? Today's business applications are usually microservice architecture, which also means that one application will deploy multiple processes. If multiple processes need to modify the same row of records in MySQL, in order to avoid dirty data caused by out-of-order operations, distribution needs to be introduced at this time. The style is locked. Want to achieve points

How SpringBoot integrates Redisson to implement delay queue How SpringBoot integrates Redisson to implement delay queue May 30, 2023 pm 02:40 PM

Usage scenario 1. The order was placed successfully but the payment was not made within 30 minutes. The payment timed out and the order was automatically canceled. 2. The order was signed and no evaluation was conducted for 7 days after signing. If the order times out and is not evaluated, the system defaults to a positive rating. 3. The order is placed successfully. If the merchant does not receive the order for 5 minutes, the order is cancelled. 4. The delivery times out, and push SMS reminder... For scenarios with long delays and low real-time performance, we can Use task scheduling to perform regular polling processing. For example: xxl-job Today we will pick

How to solve the problem that springboot cannot access the file after reading it into a jar package How to solve the problem that springboot cannot access the file after reading it into a jar package Jun 03, 2023 pm 04:38 PM

Springboot reads the file, but cannot access the latest development after packaging it into a jar package. There is a situation where springboot cannot read the file after packaging it into a jar package. The reason is that after packaging, the virtual path of the file is invalid and can only be accessed through the stream. Read. The file is under resources publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

Comparison and difference analysis between SpringBoot and SpringMVC Comparison and difference analysis between SpringBoot and SpringMVC Dec 29, 2023 am 11:02 AM

SpringBoot and SpringMVC are both commonly used frameworks in Java development, but there are some obvious differences between them. This article will explore the features and uses of these two frameworks and compare their differences. First, let's learn about SpringBoot. SpringBoot was developed by the Pivotal team to simplify the creation and deployment of applications based on the Spring framework. It provides a fast, lightweight way to build stand-alone, executable

How SpringBoot customizes Redis to implement cache serialization How SpringBoot customizes Redis to implement cache serialization Jun 03, 2023 am 11:32 AM

1. Customize RedisTemplate1.1, RedisAPI default serialization mechanism. The API-based Redis cache implementation uses the RedisTemplate template for data caching operations. Here, open the RedisTemplate class and view the source code information of the class. publicclassRedisTemplateextendsRedisAccessorimplementsRedisOperations, BeanClassLoaderAware{//Declare key, Various serialization methods of value, the initial value is empty @NullableprivateRedisSe

How to implement Springboot+Mybatis-plus without using SQL statements to add multiple tables How to implement Springboot+Mybatis-plus without using SQL statements to add multiple tables Jun 02, 2023 am 11:07 AM

When Springboot+Mybatis-plus does not use SQL statements to perform multi-table adding operations, the problems I encountered are decomposed by simulating thinking in the test environment: Create a BrandDTO object with parameters to simulate passing parameters to the background. We all know that it is extremely difficult to perform multi-table operations in Mybatis-plus. If you do not use tools such as Mybatis-plus-join, you can only configure the corresponding Mapper.xml file and configure The smelly and long ResultMap, and then write the corresponding sql statement. Although this method seems cumbersome, it is highly flexible and allows us to

How to get the value in application.yml in springboot How to get the value in application.yml in springboot Jun 03, 2023 pm 06:43 PM

In projects, some configuration information is often needed. This information may have different configurations in the test environment and the production environment, and may need to be modified later based on actual business conditions. We cannot hard-code these configurations in the code. It is best to write them in the configuration file. For example, you can write this information in the application.yml file. So, how to get or use this address in the code? There are 2 methods. Method 1: We can get the value corresponding to the key in the configuration file (application.yml) through the ${key} annotated with @Value. This method is suitable for situations where there are relatively few microservices. Method 2: In actual projects, When business is complicated, logic

See all articles