2024 스프링캠프를 다녀왔습니다. 만족스러운 세션도 있고 조금은 아쉬운 세션도 있었습니다. 청강했던 세션에서 나온 주제에 대해서 적어봤습니다.
- [동시성의 미래 - 코루틴의 버츄얼 스레드]
- [Spring AI - LLM에도 봄이 찾아오다.]
동시성의 미래 - 코루틴의 버츄얼 스레드
코루틴
원리: 코루틴은 함수의 실행을 일시 중단하고 나중에 다시 시작할 수 있게 하는 프로그래밍 패턴입니다. 전통적인 스레드와 달리, 코루틴은 특정 스레드에 묶여 있지 않으며 가벼운 작업 단위로 작동합니다. 이를 통해 비동기 프로그래밍을 더욱 간단하게 만들어주며, 한 스레드에서 여러 코루틴을 협력적으로 실행할 수 있습니다.
작동 방식:
- 일시 중단 함수 (Suspending Functions): 코루틴은
delay
와 같은 일시 중단 함수를 사용하여 실행을 중단할 수 있습니다. 일시 중단된 코루틴은 스레드를 차단하지 않으며, 다른 코루틴이 동일한 스레드에서 실행될 수 있도록 합니다. - 구조적 동시성 (Structured Concurrency): 코루틴은 특정 코루틴 스코프에서 실행됩니다. 이 스코프는 코루틴의 수명 주기를 관리하여, 코루틴이 스코프를 벗어나거나 유실되지 않도록 보장합니다.
- 취소와 예외 처리: 코루틴은 취소할 수 있으며, 코루틴의 부모-자식 관계를 통해 예외가 전파될 수 있습니다. 예를 들어, 부모 코루틴이 취소되면 자식 코루틴도 취소됩니다.
자바의 가상 스레드
원리: 자바의 가상 스레드는 프로젝트 Loom의 일환으로 도입된 개념으로, 기존의 OS 스레드보다 훨씬 가벼운 스레드를 제공합니다. 가상 스레드는 수천 개의 스레드를 효율적으로 관리할 수 있게 해주며, 고도의 동시성을 필요로 하는 애플리케이션에서 특히 유용합니다.
작동 방식:
- 경량 스레드: 가상 스레드는 사용자 모드 스레드로, 커널 모드 스레드보다 훨씬 적은 자원을 사용합니다. 이는 컨텍스트 스위칭 비용을 줄이고, 애플리케이션이 더 많은 스레드를 생성하고 관리할 수 있게 합니다.
- 스케줄링: 가상 스레드는 자바 런타임에서 관리되며, 기존의 스레드 풀이나 ExecutorService와 같이 사용할 수 있습니다. 가상 스레드는 런타임에 의해 관리되므로, 개발자는 스케줄링에 대해 신경 쓸 필요 없이 높은 수준의 동시성을 달성할 수 있습니다.
- 블로킹 작업: 가상 스레드는 블로킹 I/O 작업에서도 효율적으로 작동합니다. 예를 들어, 데이터베이스 쿼리나 네트워크 요청과 같은 블로킹 작업을 수행하는 동안에도 다른 가상 스레드가 계속해서 실행될 수 있습니다.
자바의 가상 스레드에서의 pinning 이슈
핀닝(Pinning) 이슈: 가상 스레드에서 핀닝이란 가상 스레드가 특정 캐리어 스레드에 고정되는 상황을 의미합니다. 이는 다음과 같은 경우에 발생할 수 있습니다:
- 동기화 블록 또는 메서드: 가상 스레드가
synchronized
블록이나 메서드에 들어갈 때, 해당 블록이나 메서드는 한 번에 하나의 스레드만 접근할 수 있어야 하므로 가상 스레드가 캐리어 스레드에 고정됩니다. - 네이티브 메서드 또는 외부 함수 호출: 가상 스레드가 JNI(Java Native Interface) 호출을 수행할 때, 해당 호출은 특정 스레드에서만 실행될 수 있기 때문에 가상 스레드가 캐리어 스레드에 고정됩니다.
- 블로킹 I/O 작업: 가상 스레드가 블로킹 I/O 작업(예: 소켓 I/O)을 수행할 때, 작업이 완료될 때까지 캐리어 스레드에 고정됩니다.
문제점: 핀닝된 가상 스레드는 해당 캐리어 스레드를 독점하게 되며, 다른 가상 스레드가 해당 캐리어 스레드를 사용할 수 없게 됩니다. 이는 성능 저하와 확장성 문제를 일으킬 수 있으며, 심각한 경우에는 스레드 기아 상태나 교착 상태가 발생할 수 있습니다.
향후 프로젝트 Loom 팀은 이러한 핀닝 문제를 줄이기 위한 개선 사항을 계속해서 발표할 예정입니다. 현재 핀닝 문제를 해결하기 위해서는 코드를 최적화하고, 가능한 경우 동기화 블록을 피하거나, 비동기 작업으로 전환하는 것이 좋습니다.
관련 글:
- Todd Ginsberg - Java Virtual Thread Pinning
- Inside.java - Quality Outreach Heads-up - Virtual Threads “Pinning” Issue
Spring AI - LLM에도 봄이 찾아오다.
현재 개발 중인 스프링 AI 스택에 대한 세션이었습니다. 현재 정식버전이 출시된 건 아니지만 토이 프로젝트 수준으로 테스트는 할 수 있다고 합니다.
Spring AI 프레임워크
설명: Spring AI는 스프링(Spring) 생태계의 디자인 원칙을 AI 분야에 적용한 애플리케이션 프레임워크입니다. 이 프레임워크는 AI 애플리케이션을 쉽게 개발할 수 있도록 다양한 기능을 제공하며, 특히 AI 모델을 다루기 위한 포터블 API를 지원합니다. 이를 통해 OpenAI, Azure OpenAI, Amazon Bedrock 등 다양한 AI 제공자와의 통합이 가능하며, 텍스트 생성, 이미지 생성, 임베딩 모델 등을 사용할 수 있습니다.
주요 기능:
- 포터블 API: AI 제공자 간의 일관된 API를 제공하여, 다양한 AI 모델(OpenAI, Microsoft, Amazon, Google 등)과의 통합을 쉽게 합니다.
- 벡터 스토어 API: SQL과 유사한 메타데이터 필터링 API를 통해 벡터 데이터베이스(예: Pinecone, Redis, Milvus) 간의 이식성을 제공합니다.
- 함수 호출: OpenAI 모델과 상호작용 시
java.util.Function
구현체를 사용할 수 있으며, 이를 통해 모델이 더 많은 정보를 요청할 수 있습니다. - Spring Boot 자동 구성: AI 모델 및 벡터 스토어에 대한 자동 구성을 지원하여 개발 편의성을 높입니다.
- ETL 프레임워크: 데이터 엔지니어링을 위해 설계된 ETL(Extract, Transform, Load) 프레임워크를 제공하여, 데이터를 벡터 데이터베이스로 로드하고 이를 AI 모델에 사용할 수 있게 합니다.
관련글: