限制对servlet的请求数

时间:2009-10-27 16:18:57

标签: threadpool

我们有一个servlet,由于它具有逻辑,它在服务器上占用更多的虚拟内存。出于这个原因,我们希望限制对此服务器的并发请求,例如我们只需要处理10个并发请求。其他请求必须在队列中等待。

是否可以创建自定义线程池并为此servlet分配以处理此方案?我们正在使用WebLogic Server 9.2。或者还有其他更好的方法吗?感谢任何想法。

6 个答案:

答案 0 :(得分:2)

  

是否可以创建自定义线程池并为此servlet分配以处理此方案?我们正在使用WebLogic Server 9.2。或者还有其他更好的方法吗?感谢任何想法。

是的,这是可能的。而不是使用default self-tuning work manager(从Weblogic 9.x开始,执行队列被线程池 1 的工作管理器替换),您可以创建具有特定constraints的工作管理器比如max-threads-constraint,可能还有capacity。然后,您可以使用weblogic.xml部署描述符文件的wl-dispatch-policy将Servlet分配给特定的工作管理器。


1 请注意,仍然可以使用enable WebLogic 8.1线程池模型并使用执行队列。

答案 1 :(得分:1)

你需要前面的东西或托管servlet的机器,因为当请求到达机器时,它有点太晚了:资源已被使用。您无法控制需求:您只能对此做出反应并为此做出规划。

根据您的目标要求,您可能需要软件或硬件的负载均衡器。软件负载均衡器可以简单地是一个带有会话控制的“调度程序servlet”(例如10与servlet X并发)。

还有另一种可能性:通过发出适当的HTTP代码来“限制”请求者。当然,这意味着请求方的额外逻辑......它仍然消耗服务器端的一些资源。

答案 2 :(得分:0)

您可以进行负载平衡,以便有一个辅助服务器来处理对昂贵的servlet的所有请求。

答案 3 :(得分:0)

您可以拥有一个静态计数器,以及一个仅用作昂贵方法调用的网关的servlet。你只需要在这个静态计数器上处理一个可能的竞争条件。

因此,您可以将当前的servlet转换为方法调用。

然后,网关servlet将获取请求,查看计数器是否足够低然后递增。如果超过10,则返回一些错误消息。

这不是一个理想的情况,但是如果你把东西放到队列中,那么浏览器会在一段时间后开始超时,或者用户不耐烦并反复点击提交按钮,因为它花了太长时间。

如果你可以使用javascript发送请求,那么有一些更好的解决方案可以帮助你。

答案 4 :(得分:0)

在不使用负载均衡器等的情况下,在我看来,您希望将请求与处理分离。

e.g。

  1. 浏览器发送请求。 servlet接受它,排队并递回一张票。
  2. 当资源允许时,servlet将处理此工作请求(使用单独的线程池从队列中提取工作项)。
  3. 浏览器可以使用该票证刷新(重新GET),并且servlet将返回适当的结果(例如,不处理,处理和处理)。
  4. 这是一种非常常见的模式。请注意,浏览器未被阻止,只是调度请求,然后定期执行检查以查看工作项是否完整。我成功地使用了这个(例如)我曾经让用户要求处理需要5分钟或更长时间的图表,并且使用了一个非线程安全的本机库。在那种情况下,我 将处理限制为单个线程,而不管同时请求的数量。

答案 5 :(得分:0)

我喜欢使用静态计数器和重定向以在计数器达到限制时显示错误消息的想法。

我们是否可以配置一个单独的servlet并将线程池配置为仅允许X个并发请求,所有其他请求将被放入队列以使用下一个可用的servlet。这种方法是否会引发超时错误?你能否分享一下这方面的更多细节?谢谢

http://download.oracle.com/docs/cd/E13222_01/wls/docs92/perform/appb_queues.html