2013-07-01 1 views
1

WCF 웹 서비스의 성능이 향상되고 있습니다. 이 웹 서비스는 응답하는 데 오랜 시간이 걸릴 수있는 다른 웹 서비스를 호출합니다 (5 초 이상). 서비스에 부하가 높으면 다운 스트림 서비스가 응답하기를 기다리고 있기 때문에 모든 스레드가 사용되는 상황을 경험할 수 있습니다. 이것은 전체 시스템이 백업 등을 야기합니다.작업 <T>은 실제로 사용되는 스레드 수를 줄입니까?

WCF 비동기 작업 패턴을 사용하면 실제로 도움이 될 것입니다. 내 진짜 질문은 응답을 기다리고있는 다운 스트림 서비스를 호출하는 스레드에 정확히 무슨 일이 일어나는 것입니까? 이 스레드는 여전히 백그라운드 작업자 풀이나 그 외의 호출에 할당되어 있습니까? 비동기 작업으로 이동하면 실제로 사용되는 스레드 수를 줄일 수 있다는 것을 증명할 수 있어야합니다.

답변

3

원하는 것은 장시간 실행중인 스레드를 스레드 풀로 반환하고 해당 스레드가 응답을 받기 위해 완료라고하는 것을 실행하는 것입니다. 기본적으로 스레드는 수신 스레드를 처리해야합니다 서비스에 대한 요청을 한 다음 오래 기다린 외부 서비스로 전화를 걸어 즉시 스레드 풀로 돌아가서 서비스에 대한 다른 요청에 사용할 수있게합니다. 그런 다음 제 3 자 서비스 응답이 준비되었음을 알리면 스레드 풀의 또는 다른 스레드이 응답을 가져 와서 처리하도록 할당됩니다.

작업 프레임 워크는 병렬 처리를위한 것이고 스레드 풀 기반 완료/마무리 패턴은 적습니다. 그것은 어떤 일을하기 위해 스레드를 생성하지만, 당신이 수동으로 상당히 진보 된 방법으로 개입하지 않는다면, 스레드는 장기 실행 호출 사이에 풀로 돌아 가지 않을 것입니다. 대신 비동기 패턴 호출 인 Begin/End syntax를 살펴볼 수 있습니다. 서비스의 호출 이상을 처리하도록 스레드 말했다 해제해야 응답을 기다리는 동안

http://msdn.microsoft.com/en-us/library/ms228963(v=vs.100).aspx

이러한 방법/완료 풀에 스레드를 해제합니다.

.NET 4.5를 사용하는 경우 async/await 키워드는이 패턴의 멋진 래퍼이므로 대신 사용할 수 있습니다.

+0

위대한 정보. 그래서 호기심에서 응답을 듣고있는 단일 스레드와 같은 것이 있습니까? 뭔가가 TCP 소켓을 열어야하고 최종 응답을 계속 수신해야한다는 것을 의미합니까? 그게 뭐야? 단일 스레드 (또는 고정 된 스레드 풀)를 사용하여 수신 대기중인 모든 연결간에 공유합니까? –

+0

일반적으로 이것이 패턴입니다. 하나 이상의 스레드가 포트를 공유하고 루프에서 수신 대기하고, 응답을 받으면 즉시 스레드에서이를 스핀하고 다시 청취합니다. – Haney

1

저는 ASP.NET에서 호스팅한다고 가정합니다. 이 경우 메서드가 await을 수행 할 때 요청 스레드는 스레드 풀로 완전히 반환되고 다른 요청을 처리 할 수 ​​있습니다.

int workerThreads, ioThreads; 
ThreadPool.GetMaxThreads(out workerThreads, out ioThreads); 
ThreadPool.SetMaxThreads(Environment.ProcessorCount, ioThreads); 

Environment.ProcessorCount + 1 동시 요청을 수행하는 클라이언트 테스터에 int.MaxValueServicePointManager.DefaultConnectionLimit을 설정

이를 테스트하는 가장 쉬운 방법은 서버 측에서 스레드를 제한하는 것입니다.

이 테스트의 WebAPI 예는 here입니다. WCF 예제로 변환하는 것이 어렵지 않아야합니다.

관련 문제