
최근 진행 중인 대규모 시스템 설계 스터디에서 가상 스레드(Virtual Thread)와 코루틴(Coroutine)의 유사성에 대한 이야기가 오갔다. 처음 가상 스레드를 접했을 때는 우아한형제들의 세미나를 통해 개념을 이해했지만, 코루틴에 대한 개념은 익숙하지 않았다. 이를 계기로 가상 스레드를 다시 정리하고, 차후에 코루틴과 비교해볼 계획을 세웠다.
또한, 4차 스프린트에서 푸시 알림 기능을 구현하면서 비동기 처리에 대한 고민이 깊어졌다. 많은 사용자에게 알림을 효율적으로 전송해야 하는데, 기존 스레드 모델을 사용할 경우 높은 부하가 발생할 가능성이 있었다. 이에 따라 Virtual Thread를 활용한 비동기 처리가 적절한 해결책이 될 수 있을지 고민하게 되었다.
푸시 알림 기능에선 다량의 요청을 처리하면서 비동기적으로 빠르게 알림을 전송해야 한다. 기존 스레드 모델에서는 스레드 풀을 사용하여 제한된 수의 스레드를 관리해야 하지만, Virtual Thread를 활용하면 수백만 개의 스레드를 생성하면서도 성능 저하 없이 동작할 수 있다.
푸시 알림을 처리할 때, 알림을 전송하는 과정에서 많은 네트워크 요청이 발생한다. 기존 스레드를 사용할 경우 각 요청이 Blocking 상태가 되어 대기 시간이 길어질 수 있지만, 가상 스레드는 비동기적으로 실행되며 대량의 요청을 병렬로 처리할 수 있다.
현대 서버 아키텍처에서는 I/O Blocking이 성능 병목의 주요 원인이 된다. 특히 Thread-per-Request 모델에서는 요청이 많을수록 대기 시간이 길어진다.
푸시 알림 기능을 구현할 때, 알림 서버로 다량의 요청을 전송하는 과정에서 Nonblocking I/O를 활용하면 요청 대기 시간이 줄어들고 전체 시스템의 응답성이 향상된다. 기존에는 Spring WebFlux나 Kotlin Coroutine을 사용해야 했던 부분을 Virtual Thread로 해결할 수 있는지 실험해보는 것도 흥미로운 과제가 될 것이다.
푸시 알림을 처리하는 서비스에서 가상 스레드가 어떻게 활용될 수 있을지 실험해보면서, 실제로 성능 차이가 얼마나 나는지도 확인해볼 계획이다.
푸시 알림을 보낼 때 DB에서 수신자 정보를 가져오는 과정에서 Blocking이 발생할 가능성이 있으므로, Pinning 문제가 없는지 주의해야 한다.
푸시 알림 서비스는 요청이 몰리는 경우가 많기 때문에, 기존에는 스레드 풀을 활용해 최대 동시 실행 수를 제한했다. 하지만 가상 스레드는 이러한 제한 없이 동작할 수 있다.
Virtual Thread는 가볍고, 빠르고, Nonblocking 처리 가능한 경량 스레드이다.
푸시 알림 기능을 구현하면서 비동기 처리 방식에 대한 고민을 더욱 깊이 하게 되었고, Virtual Thread가 기존의 스레드 모델을 대체할 가능성이 높다는 점을 실감했다. 아직 실험 단계지만, 실제 서비스 적용 시 어떤 장점과 한계가 있을지 검토해보는 것도 좋은 경험이 될 것이다.
향후, 푸시 알림 기능에서 Virtual Thread와 기존 비동기 처리 방식(WebFlux, Coroutine 등)의 성능 비교를 진행해볼 계획이다. 이를 통해 실제 서비스 환경에서 가장 적절한 비동기 처리 방법을 찾아나갈 것이다.