스레드 풀
저는 항상 프로젝트를 비동기식으로 다시 작성하고 싶었지만, ASP.NETMVC3는 작성하기 너무 번거롭고, .NET 4.5와 ASP.NET MVC 코드는 비교적 단순합니다. MS는 항상 이런 방식을 선호하는 것 같아요. 모든 성숙한 것들은 표준화를 위해 여러 버전을 진화시켜야 합니다. ASP.NET 왜 MVC에서 비동기를 사용해야 하는지, IIS는 사용자 요청을 처리하는 스레드 풀을 가지고 있습니다. 새로운 요청이 들어오면 풀 내 스레드들이 요청을 처리하도록 예약되지만, 동시성이 높으면 풀 내 스레드가 더 이상 많은 요청을 처리할 수 없게 되고, 풀 내 모든 스레드가 요청을 처리할 때 바쁘게 됩니다. 요청을 처리하는 스레드는 차단되며, 요청 큐가 가득 차면 웹이 다른 요청에 서비스를 제공할 수 없습니다. 서버는 요청을 거부하고 HTTP 503 바쁜 상태에 있습니다. 네트워크 작업처럼 지연 시간이 많은 경우, 대부분의 스레드는 상태를 기다리고 아무 일도 하지 않습니다. 이런 스레드는 비동기식 프로그래밍을 통해 상태를 더 잘 활용할 수 있습니다.
비동기 처리
예를 들어, 요청이 2초가 걸리는 네트워크 통화를 생성하면, 요청이 이루어집니다동기식과 비동기식 모두 실행에 2초가 소요됩니다。 하지만비동기 통화 중에는 서버가 첫 번째 요청이 완료될 때까지 다른 요청에 대한 응답을 차단하지 않습니다。 따라서 장기 실행 작업을 호출하는 많은 요청이 있을 경우, 비동기 요청은 요청이 대기열에 오르는 것을 막을 수 있습니다. .NET 4.5에서는 최대 스레드 풀이 5000개이며, 비동기 프로그래밍을 단순화하기 위해 wait와 async 키워드도 추가되었습니다.
동기식 또는 비동기식 (MSDN 발췌)
- 일반적으로 다음 조건이 충족될 때 동기화 파이프라인이 사용됩니다:
- 간단한 조작 또는 짧은 실행 시간.
- 효율성보다 단순함이 더 중요합니다.
- 이 작업은 주로 디스크나 네트워크 오버헤드가 많은 작업보다는 CPU 작업입니다. CPU 제한 작업에 비동기 연산 방식을 사용하는 것은 아무런 이점이 없고 오히려 오버헤드가 더 많아집니다.
일반적으로 비동기식 파이프라인은 다음 조건이 충족될 때 사용됩니다:
- 연산은 CPU 구속이 아니라 네트워크 바운드(네트워크 바운드) 또는 I/O 바운드입니다.
- 테스트 결과 차단 작업이 사이트 성능에 병목 현상이 된다는 것이 밝혀졌으며, 이러한 차단 호출에 비동기식 방법을 사용하면 IIS가 더 많은 요청을 처리할 수 있습니다.
- 병렬성은 코드의 단순함보다 더 중요합니다.
- 사용자가 장기 실행 요청을 취소할 수 있는 메커니즘을 제공하고자 합니다.
ASP.NET MVC에서 비동기 컨트롤러를 사용합니다
|