programing

ASP에서 비동기 컨트롤러를 사용해야 하는 경우NET MVC?

minimums 2023. 4. 23. 10:11
반응형

ASP에서 비동기 컨트롤러를 사용해야 하는 경우NET MVC?

ASP에서 비동기 액션을 사용할 때 문제가 있습니다.NET MVC앱 성능이 향상되는 시기와 개선되지 않는 시점은?

  1. ASP의 모든 장소에서 비동기 액션을 사용하는 것이 좋은가?NET MVC?
  2. waitable 메서드에 대해서: (EF/NHibernate/기타 ORM 경유로) 데이터베이스를 조회할 때 async/ait 키워드를 사용해야 합니까?
  3. wait 키워드를 사용하여 데이터베이스를 비동기적으로 쿼리할 수 있는 횟수는 1회입니까?

당신은 그 주제에 대한 의 MSDN 기사가 도움이 된다는 것을 알게 될 것이다; 나는 당신이 언제 사용해야 하는지 설명하는 그 기사에서 많은 공간을 차지했습니다.asyncASP에 접속합니다.NET, 사용방법뿐만 아니라asyncASP の asp asp asp asp asp asp 。

ASP에서 비동기 액션을 사용할 때 문제가 있습니다.NET MVC앱 성능이 향상될 때와 그렇지 않을 때.

, ★★★★★★★★★★★★★★★★★★★★★★★★★★★★.async/await스레드를 해방하는 것이 전부입니다.GUI 어플리케이션에서는 주로 GUI 스레드를 해방하여 사용자 경험을 향상시킵니다.서버 애플리케이션(ASP 포함)NET MVC)는 주로 요청 스레드를 개방하여 서버를 확장할 수 있도록 하는 것입니다.

특히, 이하와 같이 되지 않습니다.

  • 개별 요청을 더 빨리 완료할 수 있습니다.사실, 그들은 (약간) 더 느리게 완성될 것이다.
  • [발신자/]를.awaitawaitASP는 '일부러'라고 합니다.「NET」입니다.

첫 번째 질문은 ASP의 모든 장소에서 비동기 액션을 사용하는 것이 좋은가 하는 것입니다.NET MVC?

I/O를 수행하는 모든 곳에서 사용할 수 있는 것이 좋습니다.단, 반드시 유익하다고는 할 수 없습니다(아래 참조).

그러나 CPU 바인딩 방식에는 사용하지 않는 것이 좋습니다.때때로 개발자들은 그들이 다음과 같은 이점을 얻을 수 있다고 생각한다.asyncTask.Run를 사용하여 전혀 스레드 스위치의 를 받고 이 코드는 결국 다른 스레드를 사용하여 요청 스레드를 해방하기 때문에 아무런 이점이 없습니다(실제로 스레드 스위치 추가로 인한 불이익을 감수).

(EF/NHibernate/기타 ORM 경유로) 데이터베이스를 쿼리할 때 async/ait 키워드를 사용해야 합니까?

을 사용법이 응원하고 있다.async하지만 그렇지 않은 사람도 몇 명 있습니다.ORM을 지원하지 않는 async 굳이 Task.Run또는 이와 유사한 것(위 참조)을 클릭합니다.

내가 "사용할 수 있다"고 말한 것을 기억해라.ASP를 말하는 거라면.단일 데이터베이스 백엔드를 갖춘 NET MVC는 (거의 확실하게) 확장성이라는 이점을 얻을 수 없습니다.async이는 IIS가 단일 SQL Server 인스턴스(또는 다른 기존 RDBMS)보다 훨씬 더 많은 동시 요청을 처리할 수 있기 때문입니다.그러나 SQL 서버 클러스터, Azure SQL, NoSQL 등 보다 최신 백엔드를 사용하고 백엔드를 확장할 수 있으며 확장성의 병목현상이 IIS인 경우에는 다음과 같은 이점을 얻을 수 있습니다.async.

세 번째 질문 - wait 키워드를 사용하여 데이터베이스를 비동기적으로 쿼리할 수 있는 횟수는 ONE 단일 액션 방식으로 몇 번입니까?

얼마든지.단, 많은 ORM에는 접속당1개의 조작 규칙이 있습니다.특히 EF는 DbContext당 단일 작업만 허용합니다. 이 작업은 동기식인지 비동기식인지에 관계없이 마찬가지입니다.

또, 백엔드의 scalability에 주의해 주세요.SQL Server의 단일 인스턴스에서 IIS가 이미 SQL Server를 풀 캐퍼시티로 유지할 수 있는 경우 SQL Server에 대한 부하를 2배 또는 3배로 증가시켜도 전혀 도움이 되지 않습니다.

비동기 액션메서드는 액션이 여러 개의 독립된 롱런 작업을 수행해야 하는 경우에 편리합니다.

AsyncController 클래스의 일반적인 용도는 장시간 실행되는 웹 서비스 콜입니다.

데이터베이스 호출을 비동기화해야 합니까?

IIS 스레드 풀은 대부분의 경우 데이터베이스 서버보다 더 많은 동시 차단 요청을 처리할 수 있습니다.데이터베이스가 병목현상일 경우 비동기 호출에 의해 데이터베이스 응답이 고속화되지 않습니다.슬롯링 메커니즘이 없는 경우 비동기 호출을 사용하여 과부하 데이터베이스 서버에 효율적으로 더 많은 작업을 디스패치하면 데이터베이스로 더 많은 부담이 이전될 뿐입니다.DB가 병목현상이면 비동기 호출이 마법의 총알이 되지 않습니다.

1과 2의 레퍼런스를 참조주세요.

@PanagiotisKanavos 코멘트:

게다가 비동기라고 하는 것은 병렬을 의미하는 것은 아닙니다.비동기 실행으로 중요한 스레드풀 스레드가 외부 리소스에 대한 차단으로부터 해방되므로 복잡함이나 성능 비용이 들지 않습니다.즉, 같은 IIS 머신이 더 많은 동시 요청을 처리할 수 있다는 것이지 더 빨리 실행된다는 의미는 아닙니다.

또한 블로킹콜은 CPU를 많이 사용하는 스핀웨이트에서 시작된다는 점도 고려해야 합니다.부하가 높은 시간대에 통화를 차단하면 지연이 증가하고 애플리케이션 풀의 재활용이 증가합니다.비동기 콜은 단순히 이것을 회피한다.

ASP의 모든 장소에서 비동기 액션을 사용하는 것이 좋습니다.NET MVC?

프로그래밍에서 늘 그렇듯이, 상황에 따라 다르죠.어떤 길을 갈 때는 항상 트레이드오프가 있다.

async-await서비스에 대한 동시 요청을 받고 스케일아웃을 잘 하고 싶은 장소에서 빛을 발합니다.어떻게요?async-await스케일아웃에 도움이 됩니까?네트워크 콜이나 데이터베이스 히트 등 비동기 IO 을 동시에 호출하면 실행을 담당하는 현재 스레드가 차단되어 요구가 완료될 때까지 기다립니다.사용할 때async-await프레임워크가 스테이트 머신을 작성할 수 있도록 하면 IO 콜이 완료된 후 메서드가 중단된 부분부터 계속 실행됩니다.

주의할 점은 이 스테이트 머신에는 약간의 오버헤드가 있다는 것입니다.비동기 방식을 만든다고 해서 실행 속도가 빨라지는 것은 아니며, 이는 많은 사람들이 이해하는 중요한 요소이자 오해입니다.

하나 할 점async-await는 항상 비동기적이기 때문에 비동기적이 콜스택 전체를 위부터 아래까지 관통하는 것을 알 수 있습니다.즉, 동기 API를 공개하고 싶을 경우 비동기 동기화가 잘 혼합되지 않기 때문에 일정량의 코드가 중복되는 경우가 많습니다.

(EF/NHibernate/기타 ORM 경유로) 데이터베이스를 쿼리할 때 async/ait 키워드를 사용해야 합니까?

콜을 사용하는 , "IO"가 됩니다.async-awaitTask Asynchronous Pattern(TAP; 태스크 비동기 패턴)을 실장하는 비동기 방식을 공개하는 최신 데이터베이스 프로바이더가 증가하고 있기 때문에 이 방법이 적합합니다.

wait 키워드를 사용하여 데이터베이스를 비동기적으로 쿼리할 수 있는 횟수는 ONE 단일 액션 방식으로 몇 번입니까?

데이터베이스 공급자가 명시한 규칙을 따르는 한 원하는 만큼.발신할 수 있는 비동기 콜의 양에는 제한이 없습니다. 수 대해 사용할 수 .await Task.WhenAll을 하다

async액션은 액션이 DB에 대한 일부 I\O 조작 또는 요청을 처리하는 스레드가 방금 호출한 DB 또는 네트워크 경계 콜에서 응답을 받기 전에 정지되는 일부 네트워크 경계 콜을 수행할 때 가장 유용합니다.wait를 사용하는 것이 가장 좋습니다.또, 애플리케이션의 응답성이 향상됩니다(DB등의 조작을 기다리는 동안, ASP 입력/출력 스레드가 정지하는 일이 적어지기 때문입니다).마다 항상 할 수 DB로 await키워드를 지정합니다.

내 5센트:

  1. async/awaitDB 또는 외부 서비스 웹 서비스와 같은 IO 작업을 수행하는 경우에만 해당됩니다.
  2. 항상 DB보다 비동기 호출을 선호합니다.
  3. DB를 쿼리할 때마다

추신: 포인트 1의 예외적인 경우도 있지만, 비동기식 내부 기능에 대해 잘 이해할 필요가 있습니다.

또, 필요에 따라서, I/O 콜을 거의 병행할 수 없는 것도 장점입니다.

Task task1 = FooAsync(); // launch it, but don't wait for result
Task task2 = BarAsync(); // launch bar; now both foo and bar are running
await Task.WhenAll(task1, task2); // this is better in regard to exception handling
// use task1.Result, task2.Result

아시다시피 MVC는 비동기 컨트롤러를 지원하므로 이를 활용해야 합니다.컨트롤러가 장시간 작업(디스크 기반 I/O 또는 다른 원격 서비스에 대한 네트워크 호출일 수 있음)을 수행하는 경우 요청이 동기식으로 처리되면 IIS 스레드는 항상 사용 중입니다.그 결과 스레드는 긴 작업이 완료될 때까지 대기하고 있습니다.먼저 요청한 작업이 진행 중일 때 다른 요청을 처리함으로써 더 효과적으로 활용할 수 있습니다.이를 통해 더 많은 동시 요청을 처리할 수 있습니다.웹 서비스는 확장성이 뛰어나고 쉽게 C10k 문제가 발생하지 않습니다.DB 쿼리에 비동기/대기 기능을 사용하는 것이 좋습니다.네, 적당하다고 생각되는 횟수만큼 사용하실 수 있습니다.

훌륭한 조언을 얻으려면 여기를 보세요.

제 경험상 오늘날 많은 개발자들이async/await이치노

도움이 될 라는 걸 알 때만 사용하세요.

그 이유는 Stephen Cleary와 다른 사람들이 이미 언급했듯이 성능 문제를 해결하는 것이 아니라 특정 시나리오에서만 도움이 될 수 있기 때문입니다.

  • 고트래픽 컨트롤러
  • 확장 가능한 백엔드

ASP의 모든 장소에서 비동기 액션을 사용하는 것이 좋은가?NET MVC?

특히 대규모 데이터 및 계산 작업에서 발생하는 워커 프로세스 수준에서 성능 문제가 있는 경우 비동기 방법을 사용할 수 있는 모든 곳에서 이를 수행하는 것이 좋습니다.그렇지 않으면 유닛 테스트에 캐스팅이 필요하므로 필요하지 않습니다.

waitable 메서드에 대해서: (EF/NHibernate/기타 ORM 경유로) 데이터베이스를 조회할 때 async/ait 키워드를 사용해야 합니까?

예, 작업자 프로세스 수준에서 성능 문제를 방지하려면 가능한 모든 DB 작업에 비동기 기능을 사용하는 것이 좋습니다.EF는 대부분의 작업에 대해 다음과 같은 많은 비동기식 대안을 만들어 냈습니다.

.ToListAsync()
.FirstOrDefaultAsync()
.SaveChangesAsync()
.FindAsync()

wait 키워드를 사용하여 데이터베이스를 비동기적으로 쿼리할 수 있는 횟수는 1회입니까?

얼마든지 좋아요.

언급URL : https://stackoverflow.com/questions/30566848/when-should-i-use-async-controllers-in-asp-net-mvc

반응형