0

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

是否可以为此 servlet 创建和分配自定义线程池来处理这种情况?我们使用的是 WebLogic 服务器 9.2。或者有没有其他更好的方法来做到这一点?欣赏任何想法。

4

6 回答 6

2

是否可以为此 servlet 创建和分配自定义线程池来处理这种情况?我们使用的是 WebLogic 服务器 9.2。或者有没有其他更好的方法来做到这一点?欣赏任何想法。

是的,这是可能的。除了使用默认的自调整工作管理器(从 Weblogic 9.x 开始,执行队列被线程池的工作管理器替换1 ),您可以创建一个具有特定约束的工作管理器,例如. 然后,您可以使用部署描述符文件的wl-dispatch-policy将Servlet 分配给特定的工作管理器。max-threads-constraintcapacityweblogic.xml


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

于 2009-10-28T18:48:46.990 回答
1

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

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

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

于 2009-10-27T16:24:30.190 回答
0

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

于 2009-10-27T16:21:44.520 回答
0

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

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

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

这不是一个理想的情况,但是如果您将内容放入队列中,那么浏览器将在一段时间后开始超时,或者用户不耐烦并一遍又一遍地单击提交按钮,因为它花费的时间太长。

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

于 2009-10-27T16:28:30.743 回答
0

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

例如

  1. 浏览器发送请求。servlet 接收它,对其进行排队并交还一张票。
  2. servlet 将在资源允许的情况下处理此工作请求(使用单独的线程池从队列中拉出工作项)。
  3. 浏览器可以使用该票刷新(重新获取),并且 servlet 将返回适当的结果(例如,未处理、处理、已处理)。

这是很常见的模式。请注意,浏览器并未被阻止,而只是分派请求,然后定期执行检查以查看工作项是否完整。在我有用户要求需要 5 分钟或更长时间来处理图表并且使用非线程安全的本机库的情况下,我已经成功地使用了这个(例如)。在那种情况下,无论同时请求的数量如何,我必须将处理限制为单个线程。

于 2009-10-27T16:28:55.640 回答
0

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

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

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

于 2009-10-27T18:21:52.310 回答