회사에서 서비스 트래픽은 대부분 ASP.NET Core 로 작성한 API 서버로 받아서 처리한다. ASP.NET Core 서버는 내부적으로 Kestrel 이라는 웹서버를 이용하여 여러 소켓으로 들어오는 요청들을 동시에 처리해 응답하는데, 오늘은 해당 서버들의 내부 Event Loop 작동방식에 대해 정리해보려 한다.
ASP.NET Core의 이벤트 루프(Event Loop) 개념
ASP.NET Core는 전통적인 블로킹 방식의 스레드 기반 모델이 아니라, 비동기 I/O를 적극 활용하여 이벤트 기반(Event-driven) 비동기 방식으로 동작한다. 하지만 Node.js처럼 단일 이벤트 루프 모델을 사용하는 것은 아니며, 대신 비동기 태스크 기반의 스레드 풀(Thread Pool)과 이벤트 루프(Event Loop) 개념을 결합하여 작동한다.
1. 이벤트 루프(Event Loop)란?
이벤트 루프는 I/O 작업(네트워크 요청, 파일 읽기/쓰기 등)을 효율적으로 관리하는 메커니즘이다. ASP.NET Core는 이벤트 루프를 활용하여 비동기 요청을 처리하고, 블로킹 없이 여러 작업을 동시에 실행할 수 있도록 한다. ASP.NET Core에서 이벤트 루프는 주로 Kestrel 웹 서버 및 Task 기반 비동기 처리에 의해 동작한다.
2. ASP.NET Core에서 이벤트 루프가 동작하는 방식
ASP.NET Core는 요청을 처리할 때 다음과 같은 흐름으로 동작한다.
① 요청 수신
- 클라이언트가 HTTP 요청을 보냄 → 요청은 Kestrel 웹 서버에서 수신됨.
- Kestrel은 비동기 소켓(Socket) 기반의 I/O 처리를 사용하여 요청을 대기열(Queue)에 넣음.
② 요청 처리 (이벤트 루프 + 비동기 처리)
- Kestrel은 요청을 ThreadPool, I/O Completion Port (IOCP), Epoll 를 활용하여 비동기적으로 처리.
- ASP.NET Core의 미들웨어 파이프라인(Middleware)을 따라 요청이 전달됨.
- 비동기 방식으로 컨트롤러, 서비스 등을 실행(await Task 활용).
③ 결과 반환
- 응답이 준비되면, Kestrel이 비동기적으로 응답을 전송.
3. 이벤트 루프와 스레드 관리
ASP.NET Core에서 이벤트 루프는 Node.js의 단일 이벤트 루프와는 다르게, .NET의 ThreadPool을 활용하여 여러 개의 스레드를 동적으로 관리하는 방식으로 동작한다.
.NET의 스레드 풀(Thread Pool)
- 요청이 들어오면 스레드 풀에서 가용한 스레드를 사용하여 작업을 실행.
- 스레드 풀은 기본적으로 CPU 코어 수에 따라 크기가 조정되며, 동적으로 확장됨.
- async/await을 활용하면 작업이 완료될 때까지 스레드를 점유하지 않음 → 다른 요청을 동시에 처리 가능.
I/O Completion Port (IOCP)
- Windows에서는 IOCP를 활용하여 비동기 I/O 작업을 효율적으로 관리.
- Linux/macOS에서는 epoll/kqueue 등을 활용하여 비슷한 방식으로 동작.
Kestrel과 이벤트 루프
- Kestrel은 기본적으로 비동기 소켓 처리(Accept, Read, Write)를 사용.
- 요청이 들어오면 이벤트 루프가 처리할 작업을 생성하고, ThreadPool을 통해 실행.
- CPU 바운드 작업(연산량이 많은 작업)은 스레드 풀에서 실행되며, I/O 바운드 작업(파일 읽기/쓰기, 네트워크 요청 등)은 이벤트 루프에서 관리됨.
4. 비동기 이벤트 루프의 주요 특징
ASP.NET Core에서 이벤트 루프는 다음과 같은 특징을 가진다.
비동기 처리 지원 | async/await 기반으로 이벤트 루프에서 블로킹 없이 요청 처리 |
멀티스레드 사용 | Node.js와 달리 멀티스레드를 활용하여 고성능 처리 |
스레드 풀 활용 | .NET의 ThreadPool을 이용하여 필요할 때 스레드 생성/할당 |
비동기 I/O 최적화 | IOCP, epoll, kqueue 등 플랫폼별 최적화된 I/O 처리 방식 사용 |
요청 큐잉 및 분배 | Kestrel이 요청을 대기열에 저장하고, 적절한 스레드에 분배 |
참고
https://learn.microsoft.com/ko-kr/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-6.0
'tech > architecture' 카테고리의 다른 글
Two-Phase Commit(2PC)와 SAGA 패턴에 관하여 (0) | 2024.09.18 |
---|---|
캐시 구현 패턴 정리 (0) | 2024.03.29 |
분산시스템 CAP 이론에 대하여 (0) | 2024.03.24 |