2011-10-06 4 views
1

내 .Net 및 Java 응용 프로그램은 많은 시간을 들여 회신하는 웹 서비스에 대한 동시 요청을 많이해야합니다. 따라서 한 번에 수천 개의 뛰어난 HTTP 요청이있을 수 있습니다. 이를 구현하기 위해 단일 스레드가 많은 비동기 HTTP 요청을 생성하고 응답을 처리 할 수 ​​있지만 연관된 자원 비용으로 인해 수천 개의 스레드를 사용하지 않고도 동기 HTTP 요청을 허용 할 수있는 대안을 알고 싶습니다. 모든 솔루션은 HTTP 응답을 기다리는 동안 스레드가 차단되지 않도록해야합니다.많은 동시 HTTP 요청에 적합한 스레딩 모델이 있습니까?

1)이 작업을 수행하는 데 사용할 수 스레드 풀 수 :

내 질문은 두 부분으로? 스레드 풀 대기열에 내 작업을 대기시킬 수 있다는 것을 알고 스레드 풀은 스레드 풀을 처리 할 수 ​​있지만 스레드 풀 작업자 스레드가 HTTP 응답을 기다리는 것을 막을 수 있습니까? 기다리는 동안 다른 일을 처리 할 수 ​​있습니까?

2) HTTP 동기 API 호출의 단순성을 유지하면서이 작업을 수행 할 수있는 다른 방법이 있습니까?

감사

+0

"내 .Net 및 Java 응용 프로그램"- 정말 한 가지 프로세스에 모두 있습니까? 아니면 둘 중 하나 일 수 있습니까? 또는 단일 응용 프로그램의 두 가지 맛이 있습니까? –

+0

동일한 응용 프로그램의 C# 및 Java 버전이 있습니다. –

+0

[JBoss Netty] (http://www.jboss.org/netty) 또는 [Apache MINA] (http://mina.apache.org/) –

답변

1

는 스레드 풀은이 작업을 수행하는 데 사용할 수 있습니다?

그 자체는 아니요.

HTTP 동기 API 호출의 단순성을 유지하면서 다른 방법을 사용할 수 있습니까?

클라이언트 측 HTTP 호출 API에 대해 이야기하고 있습니까? 그렇다면 비동기 서버 측 구현을 사용하여이를 수행하는 방법이 있습니다.

+0

을보십시오. 클라이언트 쪽입니다. 링크에서. –

1

작업은 추가 스레드를 생성하지 않으므로 성능 적중률을 저장하고 호출 스레드를 차단하지 않으므로이 두 가지 요구를 모두 충족 할 것으로 생각됩니다.

string[] urls = GetUrls(); 
var requests = new Dictionary<string, Task<string>>() 
var responses = new Dictionary<string, string>(); 

// send off each request and store the on-going task in a dictionary 
foreach (string url in urls) 
    requests.Add(url, Task.Factory.StarNew(() => return WebClient.DownloadString(url)) 

// get the results asynchronously 
Task.Factory.StartNew(() => { 
    foreach (var request in requests) 
     responses.Add(request.key, request.Result) 
} 

이제 응답을 받으면 몇 가지 방법으로 해결할 수 있습니다. 위의 내용은 각 작업의 결과를 하나씩 가져옵니다. 결과를 호출하면 호출 메소드를 차단하고 태스크가 완료 될 때까지 대기하며 태스크가 실패하면이 시점에서 예외가 발생합니다. Task.WaitAll();을 사용하여 전체 배치를 한 번에 대기 할 수도 있습니다. .Result를 호출하면 호출 메서드가 차단되므로 작업 내부에서도 결과를 검색해야합니다.

이 예제에서는 보내는 HTTP-GET을 가정하고 결과를 문자열로 원하지만 원하는 HTTP 메서드 나 결과에 관계없이 전화를 걸고 결과를 얻는 방법은 동일합니다. 또한 발생할 수있는 예외를 잡기 위해 예외 처리를 추가하려고합니다. 작업 예외 처리에 대한 준비가 완료되었습니다 here.

관련 문제