每个上下文基础上的Tomcat最大连接数

8
我有多个Web应用程序在单个Tomcat容器下运行。由于它们都在单个Tomcat连接器下运行(如server.xml文件中定义的),因此maxConnections和maxThreads等属性管理整个容器。因此,单个应用程序可能会消耗所有可用的Tomcat线程,使其他应用程序无法获得线程并使它们无响应。我希望能够按上下文定义每个http线程的最大数量,以便不再可能出现这种情况。
到目前为止,我尝试过以下方法:
  1. 在应用程序中创建一个自定义过滤器,跟踪当前线程计数并限制额外的连接。(在这里找到了过滤器:如何在servlet中设置并发请求的数量限制?)。我不确定我喜欢这个解决方案,因为它不像Tomcat默认提供给容器的支持(如acceptCount、maxConnections、maxThreads和minSpareThreads等属性)那样全面;而添加这些功能感觉就像是我在尝试构建已经存在于Tomcat中的内容。
  2. 在server.xml文件中为每个上下文创建一个单独的Tomcat连接器。这有一些问题。首先,每个连接器都需要一个单独的端口;这意味着我必须在我的apache配置中考虑这个问题。其次,我计划定期添加更多的Web应用程序;这意味着需要进行配置更改,然后进行Tomcat重启,这会对客户产生干扰。

还有其他人遇到过类似的情况吗?我觉得应该有一种“Tomcat支持”的工作流来实现我想要的东西。


我会说你做得很好。这就是为什么使用一个应用服务器来管理一堆应用程序已经相当过时的原因之一。而且除了为每个应用程序定义自己的连接器之外,没有其他解决方案。 - Paul Wasilewski
@PaulWasilewski 你有关于更现代化的方法有什么细节吗?每个应用程序一个单独的Tomcat实例? - Staros
1
@Staros,是的,这是一种方法。但是这样很难管理。你应该使用Spring Boot、Dropwizard或Play等框架,摆脱外部应用服务器实例,并让服务器成为你代码的一部分。请参考https://jaxenter.com/java-application-servers-dead-1-111928.html。 - Paul Wasilewski
@PaulWasilewski 感谢您的反馈。我遵循了这个教程,证明了在没有列出的框架的帮助下,嵌入Tomcat到您的应用程序并不困难(因为迁移可能非常痛苦):http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/basic_app_embedded_tomcat/basic_app-tomcat-embedded.html。 - Bryan Larson
@BryanLarson,我不太了解你的应用程序,当然还有比我提到的框架更多的方法。 - Paul Wasilewski
1个回答

4
我会发布一个答案,这个答案是从Tomcat用户组提供的:http://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Semaphore_Valve(Semaphore Valve 不仅适用于 Tomcat 9,而且在 Tomcat 6 中就已经引入)。我尝试了这个概念,并找到了以下实际应用:
  1. (未经测试)Semaphore Valve 应该可以嵌套在 server.xml 文件中的 Host 元素内。
  2. (已经测试)可以在 [tomcat-home]/conf/Catalina/localhost 中放置一个 [context-name].xml 文件,并将 valve 嵌套在 Context 元素内。
这不一定是我要采取的解决方案,因为需要进行更多的测试。但是,我认为这是一个潜在的问题答案。 更新:
作为回顾,SemaphoreValve 是通过 Tomcat 用户邮件列表向我推荐的解决上述问题的选项。结果证明,它比我预期的要容易实现。只需将以下内容添加到 Tomcat/conf 目录下的 context.xml 中即可:
<Valve className="org.apache.catalina.valves.SemaphoreValve" 
       concurrency="10" 
       fairness="true" />

感谢Apache团队的Mark Thomas提供了解决方案。

SemaphoreValve选项在使用阻塞I/O(BIO)时可能是可接受的,其中每个连接都有一个线程,但是对于非阻塞I/O(NIO)配置呢?还有你提到的HTTP连接器提供的所有其他功能呢? - Paul Wasilewski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接