Mengelola siklus proses klien di Library Klien Cloud Java

Instance library klien dapat digunakan kembali dan dirancang untuk bertahan lama. Biasanya, aplikasi mempertahankan satu instance library klien, bukan membuat library untuk setiap permintaan.

Dengan menggunakan Java-KMS sebagai contoh, cuplikan berikut menunjukkan beberapa permintaan yang dipanggil dengan instance klien yang sama:

// Create one instance of KMS's KeyManagementServiceClient
KeyManagementServiceClient keyManagementServiceClient =
 KeyManagementServiceClient.create();
keyManagementServiceClient.listKeyRings();
keyManagementServiceClient.asymmetricSign();
keyManagementServiceClient.createCryptoKey();
// ... other code ...

// Create one instance of KMS's AutokeyClient
AutokeyClient autokeyClient = AutokeyClient.create();
autokeyClient.listKeyHandles();
autokeyClient.getKeyHandle();

Menutup klien

Cara Anda mengelola siklus proses klien dapat bergantung pada kasus penggunaan dan library klien tertentu. Misalnya, jika Anda menggunakan framework, ikuti panduan framework untuk pengelolaan klien. Meskipun beberapa skenario mungkin menggunakan try-with-resources untuk klien yang berumur lebih pendek, penggunaan kembali instance klien yang berumur panjang umumnya direkomendasikan untuk efisiensi

Memanggil close() pada klien akan mencoba penonaktifan yang teratur dan memastikan bahwa tugas yang ada akan berlanjut hingga selesai. Klien tidak akan menerima tugas baru. Jika Anda tidak menutup klien, resource-nya akan terus ada, dan aplikasi Anda akan mengalami kebocoran memori.

Contoh berikut menggunakan Java-KMS dan menunjukkan klien yang ditutup:

KeyManagementServiceClient keyManagementServiceClient =
  KeyManagementServiceClient.create(keyManagementServiceSettings);
// ... other code ...
keyManagementServiceClient.close();

// For gRPC clients, it's recommended to call awaitTermination to ensure a
// graceful shutdown and avoid the following error message in the logs:
// ERROR i.g.i.ManagedChannelOrphanWrapper - *~*~*~ Channel ManagedChannelImpl
// was not shutdown properly!!! ~*~*~*
// java.lang.RuntimeException: ManagedChannel allocation site
// at io.grpc.internal.ManagedChannelOrphanWrapper$ManagedChannelReference.<init>
keyManagementServiceClient.awaitTermination(DURATION, TimeUnit.SECONDS);

// Optionally include a shutdownNow() call after awaitTermination() to force
// close any lingering resources
keyManagementServiceClient.shutdownNow();

Selain close(), beberapa library klien Java mengekspos beberapa metode terkait untuk mengelola siklus proses klien:

  • shutdown(): Setara dengan close().
  • shutdownNow(): Segera memanggil proses shutdown. Menghentikan semua tugas yang sedang dieksekusi dan tidak menunggu tugas selesai.
  • isShutdown(): Menampilkan true jika tugas latar belakang telah dihentikan.
  • isTerminated(): Menampilkan true jika semua tugas telah selesai setelah penonaktifan.
  • awaitTermination(): Memblokir selama durasi hingga semua pekerjaan selesai setelah penonaktifan.

Kasus untuk beberapa klien

Mungkin ada kasus penggunaan pelanggan tertentu yang memerlukan beberapa instance library klien yang berjalan bersamaan. Kasus penggunaan utama untuk memiliki beberapa klien adalah saat ada permintaan yang harus dikirim ke beberapa endpoint yang berbeda. Instance klien terhubung ke satu endpoint. Untuk terhubung ke beberapa endpoint, buat klien untuk setiap endpoint.

Potensi risiko multiklien

Ada beberapa risiko umum pada aplikasi yang menggunakan beberapa instance library klien:

  • Meningkatkan potensi kebocoran memori. Resource tetap ada jika tidak semua instance klien ditutup dengan benar.
  • Implikasi performa. Menginisialisasi beberapa channel gRPC menimbulkan biaya performa, yang dapat bertambah di aplikasi yang sensitif terhadap performa.
  • Masalah dengan permintaan dalam penerbangan. Menutup klien saat permintaan masih dalam proses dapat menyebabkan RejectedExecutionException. Pastikan permintaan selesai sebelum menutup klien.