在 Java 適用的 Cloud 用戶端程式庫中設定虛擬執行緒

JDK 21 正式推出虛擬執行緒,可簡化高並行應用程式的開發作業。主要優點包括:

  • 提高輸送量,特別是在有封鎖 I/O 作業的應用程式中。
  • 由於輕巧,因此可最佳化記憶體。
  • 簡單的並行模型,應用程式可以採用每個要求一個執行緒的樣式表示。

將虛擬執行緒套用至應用程式前,請參閱 Open JDK 說明文件的 JEP 444:虛擬執行緒,詳細瞭解這項功能的好處和限制。

本指南逐步說明如何在 googleapis/google-cloud-java 存放區中設定 Java 適用的 Cloud 用戶端程式庫,以使用虛擬執行緒。

必要條件

如要在應用程式中使用 Java 適用的 Cloud 用戶端程式庫搭配虛擬執行緒,請按照下列必要步驟操作。

  1. 請建立 Google Cloud 專案 (如果尚未建立的話)。請參閱「建立及管理專案」。
  2. 安裝 Google Cloud CLI,以便使用專案的憑證執行範例。
  3. 使用下列指令,透過應用程式預設憑證登入。如需進一步的操作說明,請參閱「設定應用程式預設憑證」:

    gcloud auth application-default login
    
  4. 如要確認是否已安裝 Java Development Kit (JDK) 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
}