gpt4 book ai didi

java - 如何处理由于 WebSphere 中的多个 AJAX 请求而导致的高线程使用率

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:02:33 25 4
gpt4 key购买 nike

我在压力测试期间被告知我需要减少应用的线程使用量。

我们所有其他应用程序都遵循每页 1 个请求模型,而我创建了一个在加载时触发 8 个 AJAX 请求的单页应用程序。

我在 Websphere 8.5.5.1 (Servlet 3.0) 上运行。

我从浏览器向同一个 Servlet 发出 8 个 AJAX 请求,一个接一个,所以它们是并行的。

Servlet 主要检查请求参数并通过http 调用相应的ESB 服务然后返回响应。

如果我在这里说的是垃圾,请纠正我,因为我不是 100% 相信其中任何一个......

我的理解是,当请求到达 Websphere 时,它​​从线程池中获取一个线程并使用该线程执行 Servlet 并保持同一线程直到返回响应。我还认为线程会在等待 ESB 的响应时阻塞。是吗?

我正在查看以下 3 个选项:

1) 在 Servlet 3.0 中,我们可以使用异步 servlet 做的最好的事情是将请求放入队列并将线程返回到池中。然后一个或多个线程将通过为请求提供服务的队列。所以我们只是将一个线程池换成另一个,但我们可以限制/控制第二个线程池的大小。

如果我们有 Servlet 3.1 (JSR 340),我们可以使用 ReadListener,我猜我们可以在等待 ESB 响应时避免线程阻塞?

2) 在前端排队 AJAX 请求,而不是触发 8 个 AJAX 请求,我触发 3 个,当它们完成时触发下一个,依此类推,所以你永远不会有超过 3 个并行请求。

3) 向 Servlet 发出 1 个 AJAX 请求,让它调用所有 8 个 ESB 服务并合并结果。

如果上述任何解决方案有效并且我什至完全理解它们并提出其他可能的解决方案,您能否建议我?

谢谢。

最佳答案

尝试逐点回答:

  1. “Websphere 它从线程池中获取一个线程并使用该线程执行 Servlet 并保持同一线程直到返回响应。”你的理解不正确。如果 WS 使用旧 IO,这将是正确的,但是 WS 6.1 版以后使用 native IO (NIO) 和异步 IO (AIO),这允许少数线程满足数千个并发连接。看这个reference .因此,您不必担心从 AJAX 客户端建立并发连接,并行性很好
  2. 话虽如此,应用程序必须尝试避免执行任何阻塞操作,这些操作会阻塞任何能够处理多个并发连接的工作线程。想想如何异步执行每个任务,这意味着您应该能够在不阻塞自己的情况下做事。在您的情况下,您正在等待(并阻止)来自 ESB 的响应。将有大约 8 个阻塞连接到 ESB 服务。请查看您如何调用 ESB,以及您是否可以使用 NIO 进行这些调用。了解 WS 是调用 ESB 的客户端,它在 ESB 上执行的操作必须使用非阻塞 IO。
  3. 或者:有没有办法让 ESB 也表现得异步,并释放 WS 请求线程? ESB 可以在完成请求后回调 WS 服务 URL,然后您可以创建 AJAX 响应。这样你就不会阻碍 WS 线程。

在您上面的选项中,显然#1 和#3 对您没有帮助。 #2 当然会将 ESB 的并行操作限制为三个。但是,我建议看看对 ESB 的调用是否可以异步方式和非阻塞方式完成。那将是理想的。

更新

要从您的应用服务器对外部服务进行异步和非阻塞调用,请考虑使用类似 async-http-client 的库.这默认使用 Netty,但也可以插入其他 NIO 框架。这个项目的 README.md 有很好的例子,说明如何进行 HTTP 调用,并在 HTTP 请求完成时编写响应。您可以使用 onCompletion 将响应写回您的客户端。

结束语:

  1. 在倾听客户的意见时,做一个无阻塞的服务器。尽可能确保容器/服务器的请求线程不阻塞。
  2. 在调用外部服务时成为非阻塞客户端。这将允许您使用少量线程发出大量请求。

关于java - 如何处理由于 WebSphere 中的多个 AJAX 请求而导致的高线程使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26832952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com