5

我有一个 Play 2.1 Java 网络服务,它调用另一个网络服务。我的服务提供通过转换其他 Web 服务的 XML 响应生成的 JSON。

最初,我使用 Jersey-Client 库来调用我的第二个服务。由于这是一个阻塞调用,我修改了设置以允许 500 个并行线程。我用它取得了很好的结果,我做了一个 gatling 测试,它非常快(在远程服务器上处理 10 000 个请求需要 32 秒)。

然后我决定只使用异步调用来优化 I/O。现在我使用 play.libs.WS 客户端而不是带有默认线程池参数的球衣阻塞客户端。我使用 Promise 来获得结果,但我的其余代码与以前完全相同。

奇怪的是,我的 gatling 测试(只是一个发送一些 http GET 请求的循环)的性能下降了,而且速度慢了 10 倍以上......

我试图增加“默认调度程序”的线程数,但这并不是更好。

可能是因为单个线程在 WS 调用之后处理 XML 和 Json 转换?

该应用程序的结构如下:

//controller : 
Promise<Response> = myService.remoteEntities();

return async(promise.map(new Function<Response, Result>() {
        public Result apply(Response response) {
          List<Entity> entities = // ... XPATH and DOM parsing
          return ok(jsonp(callback, toJson(entities)));
        }      
});  

myService.remoteEntities 是这样定义的:

public Promise<List<Entity>> myServiceMethod {
 return WS.url(url.toString()) 
}

注意:myService 是一个 spring 服务单例,我的路由/控制器使用带有“@”符号的 spring 我已经把它放在一个单独的类中,以便能够在我的测试中使用 mock

谢谢,洛伊克

注意:我最初在这里发布了我的问题:https ://groups.google.com/forum/?fromgroups=#!topic/play-framework/SDpPA6UPyFQ

4

0 回答 0