내 응용 프로그램은 들어오는 요청을 처리하고 요청을 기반으로 결정된 "대상"시스템 중 하나에서 데이터를 검색하여 응답하는 방식으로 요청 "전달"메커니즘을 제공해야합니다. 이것은 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 클라이언트 아웃 바운드 트래픽)를 제한하려고합니다.
감사
감사합니다. 프록시를 통해 특정 대상에 액세스하는 것을 어떻게 처리합니까? 나는 현재'HttpAsyncClientBuilder'의'setProxy'를 호출합니다. 일반 브라우저에서는 * .subnet.net이 프록시를 건너 뛰어야한다고 말하는 것으로 상자에서 지원됩니다. 어떻게 이것이'HttpAsyncClient'와 함께 이루어져야 하는가? – spaceppl
RequestConfig를 사용하여 개별 요청에 대해 다른 프록시를 설정하거나 개별 경로에 대해 사용자 지정 HttpRoutePlanner를 사용할 수 있습니다 – oleg