자바용 Cloud 클라이언트 라이브러리에서 가상 스레드 구성

JDK 21에서 정식 버전으로 출시된 가상 스레드는 동시성이 높은 애플리케이션의 개발을 간소화합니다. 주요 이점은 다음과 같습니다.

  • 특히 차단 I/O 작업이 있는 애플리케이션에서 처리량이 높습니다.
  • 경량 특성으로 인한 메모리 최적화
  • 애플리케이션이 요청당 스레드 스타일로 표현될 수 있는 간단한 동시 실행 모델

애플리케이션에 가상 스레드를 적용하기 전에 Open JDK 문서의 JEP 444: 가상 스레드에서 이 기능의 이점과 제한사항을 자세히 알아보세요.

이 가이드에서는 googleapis/google-cloud-java 저장소에서 자바용 Cloud 클라이언트 라이브러리를 구성하여 가상 스레드를 사용하는 방법을 설명합니다.

기본 요건

애플리케이션에서 사용할 Java용 Cloud 클라이언트 라이브러리와 함께 가상 스레드를 사용하려면 다음 필수 단계를 따르세요.

  1. 아직 만들지 않았다면 Google Cloud 프로젝트를 만듭니다. 프로젝트 만들기 및 관리를 참조하세요.
  2. 프로젝트의 사용자 인증 정보로 샘플을 실행할 수 있는 Google Cloud CLI를 설치합니다.
  3. 다음 명령어를 사용하여 애플리케이션 기본 사용자 인증 정보로 로그인합니다. 자세한 내용은 애플리케이션 기본 사용자 인증 정보 설정을 참고하세요.

    gcloud auth application-default login
    
  4. JDK (Java Development Kit) 21 이상이 설치되어 있는지 확인하려면 java -version 명령어를 실행하고 다음 출력이 표시되는지 확인합니다. JDK 설치 단계는 Java 개발 환경 설정을 참고하세요.

    openjdk version "21.0.2" 2024-01-16 LTS
    OpenJDK Runtime Environment Temurin-21.0.2+13 (build 21.0.2+13-LTS)
    OpenJDK 64-Bit Server VM Temurin-21.0.2+13 (build 21.0.2+13-LTS, mixed mode, sharing)
    

프로젝트에 라이브러리 가져오기

이 예시에서는 google-cloud-translate을 사용합니다. Maven 또는 Gradle에서 라이브러리를 사용하는 단계는 Java용 Cloud Translation 사용을 참고하세요.

클라이언트 라이브러리에서 가상 스레드 실행기 사용

클라이언트 라이브러리 클래스를 인스턴스화할 때 전송 구현 (gRPC 및 REST)을 선택할 수 있습니다.

REST 전송

REST 전송을 구현하는 클라이언트 라이브러리는 차단 네트워크 I/O 호출을 사용하며, 이는 가상 스레드에서 제공하는 처리량 개선의 이점을 누립니다. 다음 코드 스니펫은 Java용 Cloud 클라이언트 라이브러리에서 차단 네트워크 I/O 트래픽을 가상 스레드로 관리하는 방법을 보여줍니다. TransportChannelProvider 인스턴스에서 가상 스레드 실행자로 기본 실행자를 재정의하여 자체 애플리케이션에서 이를 구현할 수 있습니다.

import com.google.cloud.translate.*;
import java.util.concurrent.Executors;

ExecutorService virtualThreadExecutor = Executors.newVirtualThreadPerTaskExecutor();
InstantiatingHttpJsonChannelProvider httpJsonChannelProvider =
        TranslationServiceSettings.defaultHttpJsonTransportProviderBuilder()
            // Use virtual threads for network I/O calls.
            .setExecutor(virtualThreadExecutor)
            .build();

try (TranslationServiceClient client =
    TranslationServiceClient.create(
        TranslationServiceSettings.newHttpJsonBuilder()
            .setTransportChannelProvider(httpJsonChannelProvider)
            .build())) {
  // Make translate requests
}

gRPC 전송

gRPC는 이미 비동기 로직을 사용하여 요청을 처리하므로 가상 스레드의 처리량 개선이 덜 두드러질 수 있습니다. 하지만 경량형 특성으로 인해 메모리 최적화 이점을 제공할 수 있습니다. 다음 코드 스니펫은 가상 스레드로 gRPC 전송 작업을 관리하는 방법을 보여줍니다. TransportChannelProvider 인스턴스에서 가상 스레드 실행자로 기본 실행자를 재정의하여 자체 애플리케이션에서 이를 구현할 수 있습니다.

import com.google.cloud.translate.*;
import java.util.concurrent.Executors;

ExecutorService virtualThreadExecutor = Executors.newVirtualThreadPerTaskExecutor();
InstantiatingGrpcChannelProvider grpcChannelProvider =
        TranslationServiceSettings.defaultGrpcTransportProviderBuilder()
            // Use virtual threads for gRPC transport operations.
            .setExecutor(virtualThreadExecutor)
            .build();

try (TranslationServiceClient client =
        TranslationServiceClient.create(
            TranslationServiceSettings.newBuilder()
                .setTransportChannelProvider(grpcChannelProvider)
                .build())) {
  // Make translate requests
}