흔한 백엔드 개발자 모임 행사에 참석하여 Virtual Thread에 관한 내용을 배웠습니다.
어설프게나마 이해하여 32회차 스터디에서 이를 공유했습니다.
부실한 내용임에도 Virtual Thread는 매력적이므로, 추가로 확인해보셨으면 좋겠습니다.
Virtual Thread
Project Loom
자바에서 경량 동시성을 구현하기 위한 프로젝트. 3가지의 핵심 기능을 통해 구성한다.
- Virthal Thread : JDK21부터 정식 Release
- Scoped Values
- Structred Concurrency
Virtual Thread를 제외한 나머지 2개의 기능은 정식 릴리즈가 되지 않았으므로 프로젝트의 목표인 경량 동시성을 유연하게 다루기는 어렵다. 하지만 Java 언어 개발에 큰 변화를 가져올 것이라고 기대하고 있다.
동시성 처리 비교
- MVC Blocking I/O : One-Thread & One-Request 방식으로, 동시에 여러 처리를 다루는데는 부족했다. (리소스 비용도 비싸다)
- Reactive NonBlocking I/O : One-Thread & Many-Request 방식으로, Netty와 같은 Event Loop 구조를 차용하는 등의 방식으로 제한된 쓰레드 내에서 동시성을 처리하기 위한 수단으로 활용. 하지만 학습 비용이 크다.
Project Loom은 Java에서도 쉽게 많은 처리를 할 수 있게 Virtual Thread를 제시했다.
다른 Thread 와의 차이
User-level Thread, Kernel Thread, Green Thread, Native Thread 용어 별로 전달하는 의미가 차이가 있다. 그래서 Virtual Thread와의 차이를 중심으로 접근했다.
Green Thread Model
JVM에 의해서 관리되는 쓰레드로, OS의 지원 없이 작동한다. 여러 동작이 하나의 프로세서에서 이뤄진다.
- 스위칭 비용이 저렴하다 (JVM이 하므로)
- 장애 발생시, 다른 작업들이 함께 장애 전파를 받는다. (모든 동작이 하나의 프로세서에서 동작하므로)
- 멀티 프로세서 환경에서도 시스템 리소스를 전부 활용할 수 없다
Native Thread Model
스케줄링이 OS에 의해 이뤄지며, Platform Thread와 OS Thread가 매칭되어 사용한다.
- 스위칭 비용이 비싸다 (OS에 의한 스케줄링이 이뤄지므로)
- 동시에 처리할 수 있는 한계가 있다 (하드웨어가 가질 수 있는 Kernel Thread만큼만 가능)
Virtual Thread
Virtual Thread는 N:1로 Carrier Thread와 맵핑, Carrier Thread는 1:1로 OS Thread와 맵핑. 적절한 Carrier Thread(스케줄러에 의해 계산한 적은 수)를 생성하여 동시에 작업을 처리한다
- Carrier Thread : 여러 Task(Virtual Thread)의 동작을 처리하는 쓰레드
- Virtual Thread는 자바 객체만큼 자원을 사용하여 Native Thread 대비 비용이 적다
- 기존 실행 정보는 모두 Heap에 저장된다. Virtual Thread 역시 GC의 대상이 된다. (무한으로 만들 수 있다 & GC에 의해 정리)
Project Loom의 나머지 2개
Structred Concurrency
구조화된 병렬 처리. 멀티 쓰레드 코드 관리를 용이하게 해주는 역할
Scoped Value #
Virtual Thread간 데이터를 공유하는 기능. 불변한 값을 지정하고 Virtual Thread간 공유하고 사용하는 기술
참고
번외
동시 처리 건수 비교
흔한 백엔드 개발자 모임 세션에서는 동시 처리 건수를 비교한 자료를 보여줬다.
- Spring MVC / tomcat = 초당 12,000건
- Webflux / Netty = 초당 17,000건
- Spring MVC / Virtual Thread = 초당 16,000건
개인 의견
코틀린의 코루틴을 써봤다면 더 이해되고 와닿을 이야기였을 것이다.
다른 언어에서 충분히 제공하고 있는 기능을 Java 언어에서 어떻게 제공할 것인가에 대한 결과물이므로, 발표자들이 이야기했던 것처럼 Java 개발에 큰 변화를 가져오지 않을까 싶다.