【问题标题】:Tomcat max connections on a per context basis基于每个上下文的 Tomcat 最大连接数
【发布时间】:2016-10-14 18:43:25
【问题描述】:

我有多个 Web 应用程序在单个 Tomcat 容器下运行。由于它们都在单个 Tomcat 连接器(如 server.xml 文件中定义)下运行,因此 maxConnections 和 maxThreads 等属性将容器作为一个整体来管理。因此,单个应用程序可能会消耗所有可用的 Tomcat 线程,从而使其他应用程序的线程匮乏并使其无响应。我希望能够在每个上下文的基础上定义最大 http 线程,这样就不再可能了。

这是我迄今为止尝试过的:

  1. 在应用程序中创建一个自定义过滤器,以跟踪当前线程数并限制其他连接。 (这里有过滤器:How to set limit to the number of concurrent request in servlet?)。我不确定我是否喜欢这个解决方案,因为它不像 Tomcat 默认为容器提供的那样全功能(支持诸如 acceptCount、maxConnections、maxThreads 和 minSpareThreads 等属性);添加功能感觉就像我在尝试构建 Tomcat 中已经存在的东西。
  2. 在 server.xml 文件中为每个上下文创建一个单独的 Tomcat 连接器。这有几个问题。一方面,每个连接器都需要一个单独的端口;这意味着我必须在我的 apache 配置中考虑到这一点。其次,我计划定期添加更多的 webapp;这意味着配置更改后会重新启动 tomcat,这会对客户端造成干扰。

有没有其他人遇到过这样的事情?我觉得应该有一个“支持 Tomcat”的工作流程来完成我所追求的。

【问题讨论】:

  • 我会说你做到了。这就是为什么使用一个应用程序服务器来管理一组应用程序已经过时的一个原因。除了为每个应用程序定义一个自己的连接器之外,没有其他解决方案。
  • @PaulWasilewski 你有什么更现代的方法的细节吗?每个应用一个 Tomcat 实例?
  • @Staros,是的,这将是一种方法。但这将很难管理。您应该使用 Spring Boot、Dropwizard 或 Play 等框架来摆脱外部应用服务器实例,让服务器成为代码的一部分。看看jaxenter.com/java-application-servers-dead-1-111928.html
  • @PaulWasilewski 感谢您的反馈。我按照本教程证明了在没有您列出的框架的帮助下将 Tomcat 嵌入到您的应用程序中并不难(因为迁移会非常痛苦):oracle.com/webfolder/technetwork/tutorials/obe/java/…
  • @BryanLarson,我对您的应用程序了解不多,并且肯定有比我提到的框架更多的方法。

标签: java tomcat servlets


【解决方案1】:

我将发布 Tomcat 用户组提供给我的答案:http://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Semaphore_Valve(信号量阀不是 Tomcat 9 特定的,但实际上是在 Tomcat 6 中引入的)。我对这个概念进行了实验,发现了以下实际应用:

  1. (未经测试)信号量阀应该能够嵌套在 server.xml 文件的 Host 元素中。
  2. (已测试)[context-name].xml 文件可以放置在 [tomcat-home]/conf/Catalina/localhost 中,阀门嵌套在 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 连接器提供的功能呢?
猜你喜欢
  • 2010-10-10
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
相关资源
最近更新 更多