2014-10-22 1 views
1

내 응용 프로그램은 들어오는 요청을 처리하고 요청을 기반으로 결정된 "대상"시스템 중 하나에서 데이터를 검색하여 응답하는 방식으로 요청 "전달"메커니즘을 제공해야합니다. 이것은 HttpAsyncClient의 콜렉션으로 구현되며, 각 콜렉션은 데이터를 검색하는 시스템에 따라 자체 구성 (MaxConnections, MaxPerRouteConnections 등)을 갖습니다.여러 HttpAsyncClient가 나쁜 관행으로 간주됩니까?

foreach (TargetSystem t: systems) { 
     RequestConfig rc = RequestConfig.custom() 
       .setConnectionRequestTimeout(s.timeout) 
       .setConnectTimeout(s.timeout) 
       .setSocketTimeout(s.timeout) 
       .build(); 

     HttpAsyncClientBuilder b = HttpAsyncClients.custom() 
       .setDefaultRequestConfig(rc) 
       .setMaxConnTotal(t.maxConnections) 
       .setMaxConnPerRoute(t.maxPerRouteConnections); 

     t.client = b.build(); 
     t.client.start(); 
} 

그런 다음 올바른 대상 클라이언트를 선택하고 비동기 HTTP 요청에 사용합니다. 모든 대상 시스템 간의 트래픽에 대해 하나의 HttpAsyncClient 만 사용해야하는지 여부는 문제입니다. 현재 각 클라이언트마다 많은 수의 스레드 (# of CPU의 수)가 열리므로 10 개의 대상에 대해 100 개 이상의 스레드로 끝납니다. 각 시스템에 최대 소켓 수를 제한하고 각 시스템에 제공되는 스레드 수 (또는 모든 HTTP 클라이언트 아웃 바운드 트래픽)를 제한하려고합니다.

감사

답변

1

은 응용 프로그램 또는 별개의 서비스 당 HttpAsyncClient 하나 개의 인스턴스 만이 있어야합니다. 여러 개의 세션/탭을 유지할 수있는 브라우저로 HttpASyncClient을 생각하십시오.

+0

감사합니다. 프록시를 통해 특정 대상에 액세스하는 것을 어떻게 처리합니까? 나는 현재'HttpAsyncClientBuilder'의'setProxy'를 호출합니다. 일반 브라우저에서는 * .subnet.net이 프록시를 건너 뛰어야한다고 말하는 것으로 상자에서 지원됩니다. 어떻게 이것이'HttpAsyncClient'와 함께 이루어져야 하는가? – spaceppl

+0

RequestConfig를 사용하여 개별 요청에 대해 다른 프록시를 설정하거나 개별 경로에 대해 사용자 지정 HttpRoutePlanner를 사용할 수 있습니다 – oleg