springboot应用程序并发请求达到多少会被拒绝

前言

前几天刷B站看到了一个问题,感觉挺有意思的,“忽略接口本身性能,springboot应用程序能处理多少请求不被拒绝?”,今天便来探一探这个问题

本文主要重点是侧重于springboot应用程序内嵌服务器的并发请求处理能力以及参数,而非接口的QPS

本文测试使用的springboot版本为 2.3.12.RELEASE

image-20230530114423863

内嵌服务器

众所周知,springboot应用程序默认的内嵌服务是tomcat

image-20230530103647753

从pom.xml依赖跟踪后发现, springboot 2.3.12.RELEASE 默认使用内嵌服务器为tomcat 9.0.46

那么,默认情况下我们springboot应用程序能处理多少请求,取决于我们内嵌tomcat服务器配置

tomcat

从springboot官网翻阅,我们程序可配置的tomcat参数有很多,但结合配置的作用说明,我们整理发现如下几个参数与并发请求处理有关

点击查看官网配置

与并发请求处理相关配置

配置属性作用默认值
server.tomcat.accept-count当所有可能的请求处理线程都在使用中时,传入连接请求的最大队列长度。(等待队列长度)100
server.tomcat.threads.max工作线程的最大数量。200
server.tomcat.threads.min-spare工作线程的最小数量。10
server.tomcat.max-connections服务器在任何给定时间接受和处理的最大连接数。一旦达到限制,操作系统仍然可以接受基于“acceptCount”属性的连接。8192

当然我们也可以通过yml文件点过去进行查看其属性以及默认值

image-20230530114208417

那么,这四者的关系是什么呢?

并发处理性能:

server.tomcat.threads.maxserver.tomcat.threads.min-spare

这两个是关于工作线程数的配置,即我们服务器至多可启用多少个线程处理我们的请求,此配置为服务器并发处理能力强弱


可以看到,我在页面请求了23次,都被tomcat服务最小工作线程(10)个处理了,为什么线程没有突破10的界限?因为我的逻辑很简单,线程数能够应对我们请求的频次,只有无法应对请求频次时,服务器的线程数会突破最小线程数设置,不断扩容直至向最大线程数

image-20230530140249829

并发处理接受能力:

可以看作为承纳并发能力的容器能装多少东西


server.tomcat.max-connections 代表着tomcat服务器一定时间内可处理的最大连接数,server.tomcat.accept-count 代表着tomcat 等待队列;这两个配置便是我们今天要探究的程序请求并发接受能力

测试

@RequestMapping("hello")
@RestController
@Log4j2
public class HelloController {

    @GetMapping
    public String helloWorld() throws InterruptedException {
        log.info("当前处理线程:{}", Thread.currentThread().getName());
        TimeUnit.SECONDS.sleep(1);
        return "helloWorld";
    }
}

对应配置属性改为较小的值方便观察测试

server:
  port: 8080
  tomcat:
    threads:
      # 最小工作线程 (默认值为10)
      min-spare: 5
      # 最大工作线程(默认值200)
      max: 10
    # 最大请求连接数为(默认值8192)
    max-connections: 30
    # 等待队列长度为(可等待10个请求)(默认值100)
    accept-count: 5

image-20230530171521699

server:
  port: 8080
  tomcat:
    threads:
      # 最小工作线程 (默认值为10)
      min-spare: 5
      # 最大工作线程(默认值200)
      max: 10
    # 最大请求连接数为(默认值8192)
    max-connections: 20
    # 等待队列长度为(可等待10个请求)(默认值100)
    accept-count: 5

image-20230530173115510

经过测试,并发请求数大于 max-connections+ accept-count -1 时,我们的请求会被丢弃,抛出连接异常信息

image-20230530173250377

结论:

如果springboot应用程序使用了tomcat程序,那么其能够支持的请求数为 max-connections+ accept-count -1,如果不改配置的话则是(8192+100-1),即可以接收8291的数据慢慢处理,并发超过该数则会被拒接,请求也不会被处理了

undertow

todo

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值