Mengonfigurasi thread virtual di Library Klien Cloud untuk Java

Thread virtual, yang tersedia secara umum di JDK 21, menyederhanakan pengembangan aplikasi konkurensi tinggi. Beberapa manfaat utama dapat mencakup:

  • Throughput yang lebih tinggi, terutama dalam aplikasi dengan operasi I/O pemblokiran.
  • Pengoptimalan memori karena sifatnya yang ringan.
  • Model konkurensi sederhana di mana aplikasi dapat direpresentasikan dalam gaya thread per permintaan.

Sebelum menerapkan thread virtual ke aplikasi Anda, lihat JEP 444: Virtual Threads dalam dokumentasi Open JDK untuk mengetahui deskripsi mendetail tentang manfaat dan batasan fitur ini.

Panduan ini menjelaskan cara mengonfigurasi Library Klien Cloud untuk Java di repositori googleapis/google-cloud-java untuk menggunakan thread virtual.

Prasyarat

Ikuti langkah-langkah prasyarat berikut untuk menggunakan thread virtual dengan Library Klien Cloud untuk Java yang ingin Anda gunakan di aplikasi Anda.

  1. Jika belum melakukannya, buat Google Cloud Project. Lihat Membuat dan mengelola project.
  2. Instal Google Cloud CLI, yang memungkinkan Anda menjalankan sampel dengan kredensial project Anda.
  3. Login dengan Kredensial Default Aplikasi menggunakan perintah berikut. Untuk mengetahui petunjuk lebih lanjut, lihat Menyiapkan Kredensial Default Aplikasi :

    gcloud auth application-default login
    
  4. Untuk memastikan Java Development Kit (JDK) 21 atau yang lebih baru telah diinstal, jalankan perintah java -version dan pastikan Anda melihat output berikut. Untuk mengetahui langkah-langkah menginstal JDK, lihat Menyiapkan Lingkungan Pengembangan 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)
    

Mengimpor library ke project Anda

Contoh ini menggunakan google-cloud-translate. Untuk mengetahui langkah-langkah menggunakan library di Maven atau Gradle, lihat Menggunakan Cloud Translation untuk Java

Menggunakan eksekutor thread virtual di library klien

Saat membuat instance class library klien, Anda dapat memilih penerapan transportnya (gRPC dan REST).

Transportasi REST

Library klien yang menerapkan transportasi REST menggunakan panggilan I/O jaringan pemblokiran, yang diuntungkan dari peningkatan throughput yang disediakan oleh thread virtual. Cuplikan kode berikut menunjukkan cara traffic I/O jaringan yang memblokir di Cloud Client Libraries untuk Java dapat dikelola oleh thread virtual. Anda dapat menerapkannya di aplikasi Anda sendiri dengan mengganti eksekutor default dengan eksekutor thread virtual dalam instance 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
}

Transportasi gRPC

Karena gRPC sudah menggunakan logika asinkron untuk menangani permintaan, peningkatan throughput dari thread virtual mungkin tidak terlalu signifikan. Namun, karena sifatnya yang ringan, fungsi ini tetap dapat memberikan beberapa manfaat pengoptimalan memori. Cuplikan kode berikut menunjukkan cara operasi transportasi gRPC dapat dikelola oleh thread virtual. Anda dapat menerapkannya di aplikasi Anda sendiri dengan mengganti eksekutor default dengan eksekutor thread virtual dalam instance 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
}