当前位置: 首页 > 知识库问答 >
问题:

Spring引导执行器在单独的Thread池中运行

尉迟韬
2023-03-14

是否可以在与“主”应用程序分开的线程池中处理像healt这样的执行器请求?

我为什么要问?我有一个应用程序有时可能会用完所有可用的线程,而Kubernetes健康检查由于没有线程来计算健康endpoint请求而失败。

我希望确保无论应用程序的负载有多大,都处理了每个健康请求。

我在考虑可能定义一个单独的线程池来操作执行器,但我不确定如何做到这一点。

共有1个答案

上官华池
2023-03-14

在Kubernetes中运行时,我们的一些应用程序也有类似的问题。我们研究了创建多个tomcat连接器和更改spring管理端口以获得所需效果的不同方法,但从未完全获得效果。

最后,我们攻克了问题的根源,那就是POD内部的资源匮乏。我们发现,经历健康检查超时的应用程序有许多额外的线程用于各种第三方线程池。在某些情况下,我们的应用程序有接近500个线程,因此,即使在我们认为的中等负载下,tomcat池也会被饿死,无法处理新的请求。

我们发现的最大的罪魁祸首是CPU请求对pod和JDK的影响。当我们没有设置任何请求时,JDK在查询处理器数量时会看到节点上的每个CPU。我们发现在Java生态系统中有很多地方使用了大量的处理器来初始化不同的线程池。

 类似资料:
  • Spring Boot执行器的两个版本(1.2.5和1.3.0)在HealthMvcEndpoint,isUnrestricted()方法(&&and)中的实现存在差异。我明白这是为了保留这些限制 http://docs.spring.io/spring-boot/docs/current-snapshot/reference/htmlsingle/#production-ready-health

  • 在最近的Spring启动升级(1.5+)后,我不再能够访问应用程序中的/Metricsendpoint。为了解决这个问题,我添加了management.security.enabled=false和management.security.roles=actuctor。这允许我访问endpoint,但它仍然需要凭据才能查看。这是可行的,但我不明白为什么。是否仅禁用执行器角色以访问此终结点?这里有安全

  • 从这份官方文件中,很难确定这两个模块之间有什么区别。 谁能提供一个官方和规范的答案来解释两者的区别吗?

  • 在Consul,可以查看SpringBoot应用程序中配置的健康状态。 或者我们是否可以让Consult拉出/调用某个服务的任何服务/URL,以便在Consult中查看响应?

  • {“Status”:“Down”} 我需要做什么才能显示自定义健康状况指示器?