spring-boot - Spring Boot : Thread pool for serving requests on Management port

标签 spring-boot spring-boot-actuator

在 Kubernetes 集群中运行时,我们使用 Spring Boot 执行器来公开事件和就绪端点。默认情况下,spring-boot 执行器在默认标准 HTTP 服务器端口上公开端点,其中请求由 Tomcat/Jetty 服务器接受器和工作线程池提供服务。我们最近在压力测试期间遇到了一个问题,即工作池中的所有线程都很忙,新请求正在排队。这导致 Pod 在 Kubernetes 集群中崩溃,因为活性探针开始失败。
我正在考虑在管理端口上暴露执行器。我想检查以下内容
a) 管理端口上的请求是否为单独的工作线程池提供服务(与标准服务器端口的请求不同)?
b) 如果 a) 的答案是否定的,有没有办法可以配置 spring boot 以使用单独的线程池作为管理端口(我们在不同的微服务中使用 tomcat/jetty 和响应式(Reactive) netty 服务器)

最佳答案

是的,如果您指定不同的管理端口,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 重新启动的问题,但是它可能无法解决您在流量激增时占用所有工作线程的根本原因。也许您需要研究诸如速率限制之类的东西来处理这种情况,因此您的服务不会获得超出其处理能力的流量。

关于spring-boot - Spring Boot : Thread pool for serving requests on Management port,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64069593/

相关文章:

java - 如何模拟 Spring bean 及其 Autowiring 的 ctor 参数?

spring - 使用 Spring Security 5 OAuth2.0 动态配置客户端注册的范围

java - Spring OAuth2 java.util.LinkedHashMap 无法转换为 org.springframework.security.web.authentication.WebAuthenticationDetails

spring-boot - Spring 启动 1.5.1 : health endpoint does not show registered health indicators

spring-boot - Spring 启动执行器 : have a customized status as plain text?

spring - 未找到多部分边界

java - 不可读属性异常 : Invalid property 'names' of bean class

java - Spring Boot 上 H2 数据库的 HTTP 删除

spring-boot - Spring Boot 2、LiquiGraph 和 Actuator 运行状况端点的 503 错误 - org.springframework.jdbc.UncategorizedSQLException

java - Spring Boot HealthIndicator 示例