【问题标题】:Spring boot : Thread pool for serving requests on Management portSpring boot:用于在管理端口上服务请求的线程池
【发布时间】:2021-01-12 02:42:12
【问题描述】:

当在 Kubernetes 集群中运行时,我们使用 spring boot 执行器来暴露活性和就绪端点。默认情况下,spring-boot 执行器在默认的标准 HTTP 服务器端口上公开端点,其中请求由 Tomcat/Jetty 服务器接受器和工作线程池提供服务。我们最近在压力测试期间遇到了一个问题,工作池中的所有线程都处于忙碌状态,并且新请求正在排队。这导致 pod 在 Kubernetes 集群中崩溃,因为 liveness probe 开始失败。

我正在考虑将执行器暴露在管理端口上。我想检查以下内容

a) 管理端口上的请求是否服务于单独的工作线程池(与标准服务器端口的工作线程池不同)?

b) 如果 a) 的答案是否定的,有没有办法可以配置 spring boot 以使用单独的线程池作为管理端口(我们在不同的微服务中使用 tomcat/jetty 和响应式 netty 服务器)

【问题讨论】:

    标签: spring-boot spring-boot-actuator


    【解决方案1】:

    是的,如果您指定不同的管理端口,Spring/Tomcat 将使用单独的线程池来处理该端口上的请求。

    例如如果你指定这样的东西是你的配置:

    server.port=8080
    management.server.port=8081
    server.tomcat.threads.max=10
    

    端口 8080 上的常规请求将由标准线程池中的线程提供服务,该线程池共有 10 个线程 (server.tomcat.threads.max)。您将在日志中看到如下所示的线程名称:

    ... nio-8080-exec-<number from 1 to 10>..
    

    管理/健康检查线程将由来自不同线程池的线程提供服务,该线程池的总大小也为 10。您将在日志文件中看到这些线程,如下所示:

    ... nio-8081-exec-<number from 1 to 10>..
    

    注意: 这样做可能会解决您的健康检查失败导致 Pod 重新启动的问题,但它可能无法解决您在爆发时所有工作线程都被占用的根本原因的交通。也许您需要研究诸如速率限制之类的东西来处理这种情况,这样您的服务就不会获得超出其处理能力的流量。

    【讨论】:

      猜你喜欢
      • 2019-04-17
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 2021-01-31
      • 2020-04-14
      • 2019-11-05
      相关资源
      最近更新 更多