首页 > 解决方案 > 管理每个 Servlet 的 Tomcat 请求

问题描述

我希望从社区中获得一些最佳实践指导。

今天我帮助管理一个 Java Web 应用程序。我们使用 Tomcat 作为容器,总共有大约 50 个 servlet。其中大部分是标准HttpServlet的扩展,尚未更新以利用 Servlet 3.X 规范的任何新异步处理功能。这些 servlet 为 UI 通信、客户端设备通信等提供支持。

我们希望缓解的问题是通过一个 servlet 发出的大量请求会导致其他 servlet 饿死。这是双重的。首先,过多的请求会消耗我们 100% 的系统资源并使系统无响应。我们可以限制和调整这些请求,使它们消耗更少的资源,但这通常会导致连接池中的堆积。无论哪种方式,我们最终都会遇到其他 servlet 没有响应的情况。

我们目前正在研究解决方案,其中包括利用 Servlet 3.0 的异步功能和线程池来支持应用程序的不同区域。首先,这将使我们能够更好地调整应用程序以适应不同类型的请求。其次,这将使我们能够评估请求的类型并相应地对其进行优先级排序。我们总是会有资源限制,至少这种方法允许我们处理最重要的工作。

我们正在争论的一个理论上的困难是,在我们将所有东西都转换为这种新方法之前(可能需要一段时间),经典的 servlet 和请求仍然会使应用程序挨饿。

我对 SO 社区的具体问题是......

  1. 当我们朝着这个机制努力时,有没有办法让我们在一个 servlet 的基础上限制请求以防止饱和?
  2. 有没有关于这种类型转换的“最佳实践”的资源?
  3. 我们想要的状态有什么陷阱吗?如果是这样,你有什么建议来减轻它们?

最后,我确实意识到,在大规模范围内,这是处理大量不同类型请求的单个单体应用程序的副产品。我们目前正在努力将应用程序模块化,并可能使我们能够将应用程序分布在不同的系统中。

谢谢!

标签: javaperformancetomcatservlets

解决方案


如果我可以提出一个不太离题的答案,您可以为不同的Executors赋予不同的优先级。

需要对其进行测试以查看好处是否真实和良好,但如果您有能力运行应用程序两次(一次由 Executor),这可能是一个临时解决方案。有罪的 servlet 将由最低优先级的 Executor 处理,而其余的将由最高优先级处理。

我看到了不同的实现方式。例如,通过更改 web.xml 以隐藏应用程序 1 中的 servlet 并转发到应用程序 2,或者通过实施过滤器来拦截对这个有罪 servlet 的调用,然后将其发送到第二个应用程序。


推荐阅读