我正在使用camel来协调对多个休息端点的Web服务调用。我正在使用多播来发送请求参数并为不同路由中的每个Web服务创建标头,并使用recepientList来调用动态URL。但看起来整个过程耗时太长。 服务响应的处理很少,因此不会超过100毫秒。
这是第一个多播路由:
from("direct:getCustomer")
.multicast().shareUnitOfWork().parallelProcessing().streaming()
.aggregationStrategy(txnAggregator)
.executorService(exeServiceForRest)
.to("direct:RouteA", "direct:RouteB", "direct:RouteC");
有8条路线可以对这个消息进行多播。 其中2条路由根据响应对另一个Web服务进行另一次多播呼叫。
from("direct:routeA")
.process(orderReqBuilder)
.streamCaching()
.recipientList(header("url"))
.multicast().shareUnitOfWork().parallelProcessing().streaming()
.executorService(exeServiceForRest)
.aggregationStrategy(txnAggregator)
.to("direct:subRouteA", "direct:subRouteB");
所有8条路线的最长响应时间为400毫秒。这些subRoute Web服务的最大响应时间为300毫秒
所以整体响应时间应为400(level 1 service calls) + 300(level2 servicer calls) + some computation time(~100 ms) = 900 ms
但它需要大约2秒才能完成。
而且,在日志中我发现:
WMPLTFMLOG420420 1501782127187 2017-08-03 10:42:07.187 when the msg comes to header builder class
WMPLTFMLOG420420 1501782127362 2017-08-03 10:42:07.362 applog.cls=org.apache.camel.component.http4.HttpComponent,applog.mthd=createConnectionManager,applog.line=322,applog.msg=Created ClientConnectionManager org.apache.http.impl.conn.PoolingHttpClientConnectionManager@77809ca2
因此,我估计在创建网址和发送请求方面花费了近200毫秒。为什么会这样? 总的来说,在这种情况下如何改善性能。我在4核机上测试了这个。 Camel版本2.18.3,我正在使用http4组件。