问题描述
我们正在使用Spring Boot执行器在Kubernetes集群中运行时公开活动性和就绪性端点。默认情况下,Spring Boot执行器在Tomcat / Jetty服务器接受器和工作线程池为请求提供服务的默认标准http服务器端口上公开端点。最近,我们在压力测试过程中遇到了一个问题,即工作池中的所有线程都处于繁忙状态,新请求正在排队。由于活动性探针开始失败,这导致pod在kubernetes集群中崩溃。
我正在考虑将执行器暴露在管理端口上。我想检查以下内容
a)管理端口上的请求是否服务于独立于标准服务器端口上的工作线程池?
b)如果对a)的回答为否,是否可以将spring boot配置为对管理端口使用单独的线程池(我们在不同的微服务中使用的是tomcat / jetty和reacitve 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 重新启动的问题,但是它可能无法解决您在爆发时占用所有工作线程的根本原因的交通。也许您需要研究诸如速率限制之类的东西来处理这种情况,这样您的服务就不会获得超出其处理能力的流量。