Configura subprocesos virtuales en las bibliotecas cliente de Cloud para Java

Los subprocesos virtuales, que están disponibles de forma general en JDK 21, simplifican el desarrollo de aplicaciones de alta simultaneidad. Estos son algunos beneficios clave:

  • Mayor capacidad de procesamiento, especialmente en aplicaciones con operaciones de E/S de bloqueo.
  • Optimización de la memoria debido a su naturaleza liviana
  • Modelo de simultaneidad simple en el que las aplicaciones se pueden representar en un estilo de un subproceso por solicitud.

Antes de aplicar subprocesos virtuales a tu aplicación, consulta la JEP 444: Virtual Threads de la documentación de Open JDK para obtener una descripción detallada de los beneficios y las limitaciones de esta función.

En esta guía, se explica cómo configurar las bibliotecas cliente de Cloud para Java en el repositorio de googleapis/google-cloud-java para usar subprocesos virtuales.

Requisitos previos

Sigue estos pasos previos para usar subprocesos virtuales con las bibliotecas cliente de Cloud para Java que deseas usar en tu aplicación.

  1. Si aún no lo hiciste, crea un Google Cloud proyecto. Consulta Crea y administra proyectos.
  2. Instala la CLI de Google Cloud, que te permite ejecutar la muestra con las credenciales de tu proyecto.
  3. Accede con las credenciales predeterminadas de la aplicación usando el siguiente comando. Para obtener más instrucciones, consulta Configura las credenciales predeterminadas de la aplicación :

    gcloud auth application-default login
    
  4. Para asegurarte de que Java Development Kit (JDK) 21 o una versión posterior esté instalado, ejecuta el comando java -version y verifica que veas el siguiente resultado. Para conocer los pasos para instalar el JDK, consulta Configura un entorno de desarrollo de 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)
    

Importa la biblioteca a tu proyecto

En este ejemplo, se usa google-cloud-translate. Para conocer los pasos para usar la biblioteca en Maven o Gradle, consulta Cómo usar Cloud Translation para Java.

Usa el ejecutor de subprocesos virtuales en las bibliotecas cliente

Cuando creas una instancia de una clase de biblioteca cliente, puedes elegir su implementación de transporte (gRPC y REST).

Transporte de REST

Las bibliotecas cliente que implementan el transporte de REST usan llamadas de E/S de red de bloqueo, que se benefician de las mejoras de rendimiento que proporcionan los subprocesos virtuales. El siguiente fragmento de código muestra cómo los subprocesos virtuales pueden administrar el bloqueo del tráfico de E/S de red en las bibliotecas cliente de Cloud para Java. Puedes implementar esto en tu propia aplicación anulando el ejecutor predeterminado con un ejecutor de subprocesos virtuales en una instancia de 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
}

Transporte de gRPC

Dado que gRPC ya usa lógica asíncrona para controlar las solicitudes, las mejoras en el rendimiento que ofrecen los subprocesos virtuales pueden ser menos pronunciadas. Sin embargo, aún pueden proporcionar algunos beneficios de optimización de la memoria debido a su naturaleza liviana. En el siguiente fragmento de código, se muestra cómo los subprocesos virtuales pueden administrar las operaciones de transporte de gRPC. Puedes implementar esto en tu propia aplicación anulando el ejecutor predeterminado con un ejecutor de subprocesos virtuales en una instancia de 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
}