我们正在从spring-ws
<bean id="OrderSubmitWebServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<constructor-arg ref="messageFactory" />
<property name="marshaller" ref="serviceMarshaller"></property>
<property name="unmarshaller" ref="serviceMarshaller"></property>
<property name="defaultUri" value="${eoe.SubmitOrderWebService.url}" />
<property name="messageSender">
<bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
<property name="connectionTimeout" value="${eoe.SubmitOrderWebService.connectionTimeout}" />
<property name="readTimeout" value="${eoe.SubmitOrderWebService.readTimeout}" />
</bean>
</property>
</bean>
来自WebService-Hosting的评论是: 您正在将多个单独的请求分组到单个TCP连接中的单个HTTP连接中。他们还说我们正在发送一个负载平衡器cookie,它将流量集中在一个Web服务器上(这可能是一些事情的结果,但可能是因为你在很长一段时间内保持这些连接)。整体效果正在降低我们平衡负荷的能力。
WS-Host的建议是:每个TCP连接只发送一个WS请求或定期断开连接。他们建议可能存在“保持活动超时”或“每个连接的最大请求数”设置。
我尝试添加以下两行,但我不相信这个问题的解决方案 - 因为 eoe.SubmitOrderWebService.url 应该是他们的负载 - 平衡器URL。
<property name="maxConnectionsPerHost"><map><entry key="${eoe.SubmitOrderWebService.url}" value="20" /></map></property>
<property name="maxTotalConnections" value="100"/>
我们正在使用 Tomcat -6.0.39, JDK - 1.6, spring-ws-core :2.1.2.RELEASE
2015年1月21日更新:我使用的是旧版本的spring-ws 2.1.2.Release,因此它在下面 - 已将其更改为2.1.4.RELEASE ...谢谢@ArtemBilan
基于以上
PoolingConnectionManager
在每个路由和总计上保持最大连接限制。默认情况下,此实现将为每个给定路由创建不超过2个并发连接,并且总共不再有20个连接。
2015年4月1日更新:我们被告知上述变更未有任何重大改进。
我们的4台服务器向其负载均衡器提交了大约25%的服务器请求,但是他们的服务器处理在第一台服务器上是11k,在第二台服务器上是4k,其余3台服务器处理的是少数100台,如下图所示:
____ Server 1 - processed 11,000 requests
Our server 1 (sent 4k)---\ |Their WS| /___ Their Server 2 - processed 4,000
Our server 2 (sent 4k)--- \______|Load |_____/____ Server 3 - processed 100 requests
Our server 3 (sent 4k)----/ |Balancer| \____ Server 4 - processed 400 requests
Our server 4 (sent 4k)---/ |URL | \___ Server 5 - processed 500 requests
WS-Host的当前评论如下:
任何改善建议都值得赞赏..
答案 0 :(得分:4)
如果我们查看HttpComponentsMessageSender
源代码,默认情况下会看到它正在汇集:
/**
* Create a new instance of the {@code HttpClientMessageSender} with a default {@link HttpClient} that uses a
* default {@link PoolingClientConnectionManager}.
*/
public HttpComponentsMessageSender() {
DefaultHttpClient defaultClient = new DefaultHttpClient(new PoolingClientConnectionManager());
defaultClient.addRequestInterceptor(new RemoveSoapHeadersInterceptor(), 0);
......
因此,它是对您的问题的有力答案:它不仅是可能的,而且是默认的。
但是,只有当我们使用Commons HTTP时才会这样做。使用标准Java HttpURLConnection
,我们没有这样的选择。