[c#] ASP.NET MVC에서 비동기 컨트롤러는 언제 사용해야합니까?


Answers

주제에 대한MSDN 기사가 도움이 될 수 있습니다 . 이 기사에서 ASP.NET에서 async 를 사용 하는 방법 뿐 아니라 ASP.NET에서 async 를 사용해야 하는 시기 에 대해 많은 공간을 차지했습니다.

ASP.NET MVC에서 비동기 작업을 사용하는 데 대한 우려가 있습니다. 언제 내 애플 리케이션의 성능을 향상시킬 수 있습니다.

먼저, async / await 은 모든 스레드해제 한다는 것을 이해해야 합니다 . GUI 응용 프로그램의 경우 주로 GUI 스레드를 해제 하여 사용자 경험이 향상되었습니다. ASP.NET MVC를 포함한 서버 응용 프로그램의 경우 주로 요청 스레드를 해제 하여 서버 규모를 조정할 수 있습니다.

특히, 그것은 하지 않을 것이다 :

  • 개별 요청을 더 빨리 완료하십시오. 사실, 그들은 (천천히 조금만) 느리게 완성 될 것입니다.
  • await 동안 발신자 / 브라우저로 돌아갑니다. 브라우저가 아니라 ASP.NET 스레드 풀에만 "수익"을 await 립니다.

첫 번째 질문은 ASP.NET MVC의 모든 곳에서 비동기 액션을 사용하는 것이 좋습니까?

I / O를 수행하는 모든 곳에서 사용하는 것이 좋다고 말하고 싶습니다. 그래도 유익한 것은 아닙니다 (아래 참조).

그러나 CPU 바인딩 방식에 사용하는 것은 좋지 않습니다 . 때때로 devs는 컨트롤러에서 Task.Run 을 호출하여 async 의 이점을 얻을 수 있다고 생각합니다. 이것은 끔찍한 생각입니다. 그 코드는 다른 쓰레드를 차지함으로써 요청 쓰레드를 풀어 버리기 때문에 아무런 이점도 없다. (실제로 쓰레드는 여분의 쓰레드 스위치를 사용하고있다)!

데이터베이스를 질의 할 때 비동기 / 키워드를 기다려야합니까 (EF / NHibernate / 다른 ORM을 통해)?

당신은 가능한 모든 방법을 사용할 수 있습니다. 현재 대부분의 주요 플레이어는 async 지원하지만 그렇지 않은 플레이어도 있습니다. ORM이 async 지원하지 않는다면, Task.Run 또는 그와 비슷한 것으로 포장하지 마십시오 (위 참조).

나는 당신 사용할 있다고 말했다. 단일 데이터베이스 백엔드로 ASP.NET MVC에 대해 이야기하고 있다면 async 확장 성 혜택을 거의 얻지 못할 것입니다. 이것은 IIS가 SQL 서버 (또는 다른 클래식 RDBMS)의 단일 인스턴스보다 훨씬 많은 동시 요청을 처리 할 수 ​​있기 때문입니다. 그러나 백엔드가 SQL 서버 클러스터 인 Azure SQL, NoSQL 등 최신 버전이고 백엔드가 확장 가능하고 확장 성 병목 현상이 IIS 인 경우 async 인한 확장 성 혜택을 누릴 수 있습니다.

세 번째 질문 - 하나의 단일 액션 메소드에서 데이터베이스를 비동기 적으로 쿼리하는 데 키워드를 사용할 수 있습니까?

네가 좋아하는만큼. 그러나 많은 ORM에는 연결 당 1 작업 룰이 있습니다. 특히 EF는 DbContext 당 하나의 작업 만 허용합니다. 이는 작업이 동기식이든 비동기식이든 상관 없습니다.

또한 백엔드의 확장 성을 다시 염두에 두십시오. SQL Server의 단일 인스턴스를 사용하고 있고 IIS가 이미 SQLServer를 최대 용량으로 유지할 수 있다면 SQLServer에 대한 부담을 두 배로하거나 세 배로 늘리는 것이 전혀 도움이되지 않습니다.

Question

ASP.NET MVC에서 비동기 작업을 사용하는 데 대한 우려가 있습니다. 언제 내 앱의 성능을 향상시킬 수 있습니까?

  1. ASP.NET MVC에서 비동기 액션을 사용하는 것이 좋습니다.
  2. 기다릴 수있는 방법에 관해서 : (EF / NHibernate / 다른 ORM을 통해) 데이터베이스를 질의 할 때 async / 키워드를 기다려야합니까?
  3. 하나의 단일 액션 메소드에서 비동기 적으로 데이터베이스를 쿼리하기 위해 키워드를 기다리는 횟수를 몇 번 사용할 수 있습니까?



async 작업은 작업이 DB 또는 네트워크 바인딩 된 호출에 대해 일부 I \ O 작업을 수행 할 때 가장 도움이됩니다. 여기서 호출을 요청한 DB 또는 네트워크 바인딩 호출에서 응답을 받기 전에 요청을 처리하는 스레드가 지연됩니다. DB를 비롯한 다른 작업을 기다리는 동안 ASP 입력 / 출력 스레드가 더 적어지기 때문에 응용 프로그램의 응답 속도가 향상 될 것입니다. 모든 응용 프로그램에서 DB에 대한 많은 호출이 필요할 때마다 항상 awaiatable 메서드로 래핑 한 다음 키워드를 사용하여 호출했습니다.




아시다시피 MVC는 비동기 컨트롤러를 지원하므로이를 활용해야합니다. 컨트롤러가 긴 작업을 수행하는 경우 (디스크 기반 I / O 또는 다른 원격 서비스에 대한 네트워크 호출 일 수 있음) 요청이 동기식 방식으로 처리되는 경우 IIS 스레드는 전체적으로 사용 중입니다. 결과적으로 스레드는 오랜 시간이 걸리는 작업이 완료되기를 기다리고 있습니다. 처음에 요청 된 작업이 진행되는 동안 다른 요청을 제공함으로써 더 잘 활용 될 수 있습니다. 이렇게하면 더 많은 동시 요청을 처리하는 데 도움이됩니다. 귀하의 웹 서비스는 확장 성이 뛰어나며 C10k 문제에 쉽게 부딪치지 않습니다. db 쿼리에 async / await를 사용하는 것이 좋습니다. 네, 당신이 생각하는만큼 여러 번 사용할 수 있습니다.

훌륭한 조언을 구하십시오.




Links