在Kubernetes集群中运行时,我们使用Spring Boot执行器来公开活跃度和就绪endpoint。默认情况下,spring-boot执行器公开默认标准HTTP服务器端口上的endpoint,请求由Tomcat/Jetty服务器接受器和工作线程池提供。我们最近在压力测试过程中遇到了一个问题,工作池中的所有线程都很忙,新的请求都在排队。这导致了在Kubernetes星系团中的pod坠毁,因为活性探测器开始失败。
我正在考虑暴露管理端口上的执行器。我想看看下面的情况
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重新启动的健康检查失败的问题,但是它可能无法解决当流量突发时所有工作线程被占用的根本原因。也许您需要研究一些诸如速率限制之类的东西来处理这种情况,这样您的服务就不会获得超过它所能处理的流量。
这是我的错误: 好了,够清楚了。我试图通过实现这个解决方案来保持请求上下文: 如何在异步任务执行器中启用请求范围 null 我已经试过了,但没有成功: 如何在异步任务执行器中启用请求范围 如果有关系: 为应用程序中的所有线程设置ThreadContext 但是上下文总是空的...
问题内容: 在Java中创建FixedThreadPool Executor对象时,您需要传递一个参数,该参数描述Executor可以同时执行的线程数。我正在建立一个服务类,其职责是处理大量电话号码。对于每个电话号码,我需要执行Web服务(这是我的瓶颈),然后将响应保存在哈希图中。 为了使此瓶颈对我的服务性能的危害减少,我决定创建Worker类,该类将获取未处理的元素并对其进行处理。Worker类
我有一个Java web应用程序,使用SPRING进行REST调用。 我想控制应用程序为请求打开的线程数。 所以我添加了线程配置: 我使用的同步服务不是异步的,我对它进行了测试,它没有限制处理请求的线程,而是同时处理所有请求。 我所期望的是,当我一次发送两个请求时,要么抛出第二个请求,要么等待第一个请求完成。 我根本没有在我的应用程序中实现Thread。这是我的控制器的相关代码: 这是控制台结果:
我们的主要应用程序在端口8443上提供服务,我们使用在端口8444上提供执行器endpoint服务。 有没有办法让一个endpoint(健康endpoint)同时服务于8443和8444,而将其余endpoint仅保留在端口8444上?
我有一个LDAP服务器正在运行。使用的LDAP服务是OpenDJ的。 现在发生的是,这台机器上的目录管理器服务正在使用java。lang.OutOfMemoryError 关于获取目录管理器服务的线程转储,下面是我们得到的 线t@883:(状态=阻塞)-太阳。杂项。不安全的park(boolean,long)@bci=0(编译帧;信息可能不精确)-java。util。同时发生的锁。锁支架。park
我只是想了解如何在Java中编写一个每请求线程的TCP服务器。我已经编写了一个每连接线程的服务器,它运行serverSocket.accept()并在每次新连接进入时创建一个新线程。 如何将其修改为每请求线程服务器?我想传入的连接可以放入某种队列中,但是您如何知道哪个连接发出了请求&准备好了服务呢? 我怀疑NIO在这里是必要的,但不确定。 多谢了。 [编辑] 明确一点--原来的“服务器”只是我编写