1

环境:Webphere 6、Solaris box、Thick client、Java web app。

请求数可以在 400 - 600 之间。在对服务器的每个请求上,我创建 15 个线程(使用 Java ExecutorService)同时请求 15 个不同的 Web 服务,并将所有响应数据组合在一起并将其发送回用户。负载测试在近 150 - 170 个用户时失败。在为这些 Web 服务提供服务的数据库中可以看到 CPU 和内存峰值,最终在很短的时间后应用服务器也崩溃了。Web 服务的响应时间最长为 10-12 秒,最短为 4-6 秒。数据库的连接池大小为 40。

我假设 150 个请求正在创建 150*15=2250 个线程,并且应用服务器资源正在飙升并因此崩溃。所以我想使用 App 服务器线程池并让 threadCount 说 100(可能不是好数字..)。令我困扰的一件事是,使用 100 个线程,我可以处理前 6 个(6*15 = 90)个请求和第 7 个请求的 10 个调用。下一个请求必须等待 10-15 秒才能恢复线程,然后再等待 10-15 秒才能调用自己的 Web 服务。这种方法甚至好吗?

另一个想法是 Websphere 中提供的异步 bean。哪一个适合我的要求。

请推荐!!一个接一个地调用一个网络服务总共需要 15*(假设每个请求需要 4 秒)= 60 秒,这真的很糟糕。所以把webserices一起调用是我想做的。

4

1 回答 1

1

不推荐在应用服务器中管理你的线程。如果您使用 EJB,规范不允许.

为什么不使用缓存解决方案来提高性能?最初的几个请求会比较慢,但是一旦缓存很热,一切都会非常快。

如果缓存数据不可行,那么改变客户端向服务器发出多个请求,而不是将一个请求拆分为多个线程呢?您需要更改您的 Web 应用程序,以便每个方法都调用一个 Web 服务。客户端将调用(并行)当前页面所需的每个方法并组装最终结果(如果您愿意,可以显示部分结果)。通过这样做,您将并行工作并且不会违反规范。

我假设您的服务器中有这样的东西:

public Result retriveData(Long id) {
   Result myResult = new Result();
   //...
   //do some stuff
   myResult.setSomeData(slowWebService1.retriveSomeData(id));
   myResult.setSomeOtherData(slowWebService2.retriveSomeOtherData(id));
   myResult.setData(slowWebService3.retriveData(id));
   return myResult;
}

在您的客户中:

Result result = webApplication.retriveData(10);
//use the result

我的建议是将调用拆分为多种方法:

 public SomeData retriveSomeData(Long id) {
    //do some stuff
    SomeData data = slowWebService1.retriveSomeData(id);
    //do more stuff
    return data;
 }

 public SomeOtherData retriveSomeOtherData(Long id) {
    //do some stuff
    SomeOtherData data = slowWebService2.retriveSomeOtherData(id);
    //do more stuff
    return data;
 }

 public Data retriveData(Long id) {
    //do some stuff
    Data data = slowWebService3.retriveData(id);
    //do more stuff
    return data;
 }

在您的客户中:

//Call these methods in parallel, if you were using Swing, this could be done with
//SwingWorker (I have no idea how to it with Flash :)). 
//You can either wait for all methods to return or show partial results.
callInBackground(webApplication.retriveSomeData(10), useDataWhenDone);
callInBackground(webApplication.retriveSomeOtherData(10), useDataWhenDone);
callInBackground(webApplication.retriveData(10), useDataWhenDone);

通过这样做,您只调用您的 Web 应用程序,就像以前一样,因此不应该有任何安全问题。

我不熟悉 Websphere,所以我不知道使用它的异步 bean 是否比这更好,但恕我直言,您应该避免手动启动线程。

于 2011-06-10T18:58:40.427 回答