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

Bry*_*son 7 java tomcat servlets

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

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

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

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

Bry*_*son 4

我将发布 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" />
Run Code Online (Sandbox Code Playgroud)

感谢 Apache 小组的 Mark Thomas 提供了解决方案。