私のアプリケーションは、クライアントの http リクエストを処理し、いくつかの API と通信し、データをクライアントに返す必要があります。以下のように、アプリケーションのグローバルな RestTemplate を宣言します。
<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient">
<constructor-arg index="0">
<bean id="httpClientParams" class="org.apache.commons.httpclient.params.HttpClientParams">
<property name="authenticationPreemptive" value="false" />
</bean>
</constructor-arg>
<constructor-arg index="1">
<bean class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
<property name="params">
<bean class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
<property name="connectionTimeout" value="20000" />
<property name="soTimeout" value="20000" />
<property name="defaultMaxConnectionsPerHost" value="30" />
<property name="maxTotalConnections" value="500" />
</bean>
</property>
</bean>
</constructor-arg>
</bean>
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<property name="requestFactory">
<bean class="org.springframework.http.client.CommonsClientHttpRequestFactory">
<property name="httpClient" ref="httpClient" />
</bean>
</property>
</bean>
設定によりdefaultMaxConnectionsPerHost
、ホストあたりの同時接続数は30になると予想されます。しかし、私のテストでは、実際の数は、設定したサイズに関係なく、最大で6defaultMaxConnectionsPerHost
のようです。
私のテストのやり方:
- クライアント側: Web アプリケーションに約 20 のリクエストをブラウザー経由で同時に送信します (FireFox と Chrome を試しました)。
- サーバー側:接続数を取得する
netstat
質問:
- 質問 1: ホストあたりの同時接続数が予想どおり 30 にならないのはなぜですか?
- 質問 2: 私のアプリケーションは、1 つのホストに毎秒約 10 個のリクエストを送信する必要があります。各リクエストは 2 秒間続きます。では、適切な値は何
defaultMaxConnectionsPerHost
に設定すればよいでしょうか?