Java 如何处理WebSphere中多个AJAX请求导致的高线程使用率

Java 如何处理WebSphere中多个AJAX请求导致的高线程使用率,java,ajax,multithreading,websphere,threadpool,Java,Ajax,Multithreading,Websphere,Threadpool,在压力测试期间,我被告知我需要减少应用程序的线程使用量 我们所有的其他应用程序都遵循每页1个请求的模式,而我创建了一个单页应用程序,在加载时触发8个AJAX请求 我运行的是WebSphere8.5.5.1(Servlet3.0) 我正在从浏览器向同一个Servlet发出8个AJAX请求,一个接一个,因此它们是并行的 Servlet基本上检查请求参数并通过http调用相应的ESB服务,然后返回响应 请纠正我,如果我在这里说的任何东西都是垃圾,因为我不是100%的对任何它 我的理解是,当请求到达We

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

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

我运行的是WebSphere8.5.5.1(Servlet3.0)

我正在从浏览器向同一个Servlet发出8个AJAX请求,一个接一个,因此它们是并行的

Servlet基本上检查请求参数并通过http调用相应的ESB服务,然后返回响应

请纠正我,如果我在这里说的任何东西都是垃圾,因为我不是100%的对任何它

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

我正在考虑以下3个选项:

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

如果我们有Servlet3.1(JSR340),我们可以使用ReadListener,我猜我们可以在等待ESB响应时避免线程阻塞

2) 在前端对AJAX请求进行排队,这样我就不会发出8个AJAX请求,而是发出3个请求,当它们完成时,就会发出下一个请求,以此类推,这样您就不会有超过3个并行请求

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

你能告诉我上述任何解决方案是否有效,我是否完全理解它们,并建议其他可能的解决方案吗


谢谢。

尝试逐点回答:

  • “WebSphereIT从线程池中获取一个线程,并使用该线程执行Servlet,并保持同一线程直到返回响应。”您的理解是错误的。如果WS使用旧IO,这是正确的,但是WS 6.1版以后的版本使用本机IO(NIO)和异步IO(AIO),这允许少数线程满足数千个并发连接。看这个。因此,您不必担心从AJAX客户端进行并发连接,并行性也很好
  • 话虽如此,应用程序必须尝试并避免执行任何阻塞操作,这些操作会阻塞任何能够处理多个并发连接的工作线程。只需考虑如何异步执行每个任务,这意味着您应该能够在不阻塞自己的情况下完成任务。在您的情况下,您正在等待(并阻止)来自ESB的响应。将有8个到ESB服务的阻塞连接。请检查您是如何调用ESB的,以及是否可以使用NIO进行这些调用。了解WS是调用ESB的客户机,它必须为在ESB上执行的操作使用非阻塞IO
  • 或者:有没有一种方法,ESB也可以异步运行,并释放WS-request线程?ESB可以在处理完请求后回调WS-service URL,然后您可以创建AJAX响应。这样您就不会占用WS-threads
  • 在上面的选项中,显然1和3对您没有帮助#2当然会将ESB的并行操作限制为三个。但是,我建议查看对ESB的调用是否可以以异步方式和非阻塞方式完成。那将是理想的

    更新

    <>为了从应用服务器中对外部服务进行异步和非阻塞调用,请考虑使用类似的库。默认情况下,它使用Netty,但也可以插入其他NIO框架。该项目的README.md提供了关于如何进行HTTP调用以及在完成HTTP请求时编写响应的良好示例。您可以使用
    onCompletion
    将响应写回客户端

    结论声明:

  • 在监听客户机时成为非阻塞服务器。尽可能确保容器/服务器的请求线程不阻塞
  • 在调用外部服务时成为非阻塞客户端。这将允许您使用少量线程发出大量请求

  • 谢谢你纠正我的错误,曼尼什,我将马上阅读NIO的参考资料,并消化你的所有建议。很appreciated@user1810292不幸的是,这并不完全正确。尽管NIO允许连接20000个用户,但只有
    pool max size
    将同时处理。所以,如果您的请求很长,那么您肯定会遇到线程池饱和的问题。假设您的8个req中的每一个都需要1秒,那么您将能够处理大约6个并发客户端和50个线程池。其他请求将等待。谢谢。我明白你的意思。我想知道对于http请求来说,非阻塞和异步是否不是一回事。如果我使用另一个线程来处理对ESB的调用,并将原始线程释放回池中,我的新线程将被阻塞,因此这是毫无意义的。我真正需要做的是实现对ESB的非阻塞调用。这可以用netty或类似的工具来完成吗?我猜它需要在操作系统级别使用非阻塞套接字?基本上,我是在问如何执行非阻塞http请求并在Servlet中处理响应,以确保最大程度的线程重用?@Gas这就是我们建议在请求线程中“避免做任何阻塞操作”的原因。在这种情况下,请求线程被阻塞,等待ESB服务的响应。这主要是在IO上,可以解决。用户1810292:请看看你