环境:WebSphere 6、Solaris box、Thick客户端、Java web应用程序。
请求数量可以在400到600之间。在向服务器发出的每个请求中,我都会创建15个线程(使用Java ExecutorService),用于同时请求15个不同的Web服务,并将所有响应数据分组并发送回用户。负载测试在近150-170个用户中失败。在为这些Web服务的数据库中可以看到CPU和内存峰值,最终在很短的时间内应用程序服务器也会崩溃。Web服务的响应时间最长为10-12秒,最短为4-6秒。数据库的连接池大小为40。
我假设150个请求正在创建150*15=2250个线程,应用程序服务器资源正在被添加,从而崩溃。所以我想使用应用服务器线程池,并让线程计数说100(可能不是一个好数字…)。有一件事让我很困扰,有了100个线程,我可以处理前6个(6*15=90)请求和10个第7个请求的调用。下一个请求必须等待10-15秒才能取回线程,然后再等待10-15秒来调用自己的Web服务。这种方法好吗?
另一个想法是在Websphere中提供异步bean。哪一个符合我的要求。
请建议!!。调用一个又一个Web服务总共需要15*(假设每个请求4秒)=60秒,这真的很糟糕。所以我想一起调用weberices。
不建议在应用程序服务器中管理线程。如果您使用的是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是否比这更好,但IMHO应该避免手动启动线程。