ASP.NET Core - 비동기가 유용한 이유

2145 단어 dotnetapiwebdevcsharp
ASP.NET Core 애플리케이션에서 왜 asyncawait를 사용해야 하는지 궁금한 적이 있습니까? 성능에 대해 들어보셨을 것입니다. 그리고 거기에는 약간의 진실이 있지만 당신이 생각하는 방식은 아닙니다.

다음 비동기 컨트롤러 코드를 살펴보십시오.

[HttpGet]
public async Task<IActionResult> GetByIdAsync(int id)
{
    var entity = await repository.GetByIdAsync(id).ConfigureAwait(false);
    return Ok(entity);
}



그리고 여기 그것의 "동기화"버전:

[HttpGet]
public IActionResult GetById(int id)
{
    var entity = repository.GetById(id);
    return Ok(entity);
}



그들은 거의 동일하게 보입니다. 그래서 여기서 비동기 버전을 선호해야 하는 이유는 무엇입니까?

답은 성능이 아니라 실행 속도가 더 빠릅니다. 답은 확장성이 더 좋다는 것입니다. 동기식 버전을 잠시 분석해 보겠습니다. 칠 때repository.GetById(...)
현재 작업자 스레드가 중지되고 작업이 완료될 때까지 기다려야 합니다. 실제 작업을 수행하는 SQL Server가 있을 가능성이 큽니다. 그리고 이것들은 로컬도 아니고 다른 기계에 있기 때문에 응답이 돌아올 때까지 서버는 문자 그대로 유휴 상태입니다. 이런 일이 발생하면 컨트롤러가 반환됩니다.

이제 비동기 버전을 확인하겠습니다.
여기에서도 저장소가 작업을 완료할 때까지 기다려야 하지만 중요한 차이점이 있습니다. await 키워드를 사용하면 현재 작업자 스레드가 프로그램에서 "분리"되어 스레드 풀로 돌아갈 수 있습니다. GetByIdAsync가 완료되면,

.NET은 풀에서 다른 스레드를 가져오고 작업을 계속합니다. 이제 런타임은 동일합니다. 분명한 것은 비동기 버전이 약간(측정 가능하지만 중요하지 않다는 의미에서) 더 느릴 수도 있다는 것입니다. 그러나 스레드를 스레드 풀로 반환하고 비동기 작업이 완료되면 선택합니다. 이것은 확장성이라는 한 가지 측면에서 중요합니다.

서버에 요청을 할 때마다 새로운 작업자 스레드가 작업을 처리합니다. 스레드를 반환하면 스레드가 유휴 상태일 때 해당 스레드를 활용하여 다른 요청을 처리할 수 있습니다. 이것이 바로 async 및 await가 ASP.NET Core와 함께 강력한 이유입니다.

또 다른 간단한 예: 풀에 사용 가능한 작업자 스레드가 1개만 있는 서버가 있다고 가정해 보십시오. 또한 두 개의 요청이 곧 차례로 들어오고 있습니다.

동기식 버전에서는 더 이상 사용 가능한 자유 스레드가 없기 때문에 첫 번째 요청만 처리할 수 있습니다. 비동기 버전에서는 첫 번째 요청이 await repository.GetByIdAsync(...) 라인에 도달하면 두 번째 요청을 즉시 처리할 수 있습니다.

두 번째 요청도 이 줄을 만나서 하나의 스레드를 다시 풀로 반환합니다. 이 스레드는 요청 1에 의해 즉시 선택되어 응답을 반환합니다. 나중에 요청 2에 대한 답변을 반환할 수 있습니다.

물론 이것은 만들어진 시나리오입니다. 나는 당신이 그것에 부딪치지 않기를 바라지만, 또한 async 및 await의 힘을 보여줍니다. 모든 요청을 처리할 수 없는 대신 시간이 조금 더 걸리더라도 처리할 수 없습니다.

결론



ASP.NET Core의 비동기 프로그래밍은 웹 애플리케이션을 확장하는 매우 효율적인 방법입니다. 서버를 최대한 활용할 수 있으며 시스템 리소스는 단순히 유휴 상태가 아닙니다!

좋은 웹페이지 즐겨찾기