Administra los ciclos de vida del cliente en las bibliotecas cliente de Cloud para Java

Las instancias de la biblioteca cliente son reutilizables y están diseñadas para durar mucho tiempo. Por lo general, las aplicaciones mantienen una sola instancia de una biblioteca cliente, en lugar de crear una biblioteca para cada solicitud.

Si se usa Java-KMS como ejemplo, el siguiente fragmento muestra varias solicitudes que se invocan con la misma instancia del cliente:

// 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();

Cómo cerrar un cliente

La forma en que administras el ciclo de vida de un cliente puede depender del caso de uso y de la biblioteca cliente específica. Por ejemplo, si usas un framework, sigue sus lineamientos para la administración de clientes. Si bien en algunos casos se puede usar try-with-resources para clientes de menor duración, por lo general, se recomienda reutilizar una instancia de cliente de larga duración para lograr eficiencia.

Llamar a close() en un cliente intenta un cierre ordenado y garantiza que las tareas existentes continúen hasta su finalización. El cliente no aceptará tareas nuevas. Si no lo cierras, sus recursos seguirán persistiendo y tu aplicación tendrá pérdidas de memoria.

En el siguiente ejemplo, se usa Java-KMS y se muestra el cierre del cliente:

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();

Además de close(), algunas bibliotecas cliente de Java exponen algunos métodos relacionados para administrar el ciclo de vida del cliente:

  • shutdown(): Equivale a close().
  • shutdownNow(): Invoca el proceso de apagado de inmediato. Detiene todas las tareas en ejecución y no espera a que se completen.
  • isShutdown(): Devuelve true si se cerraron las tareas en segundo plano.
  • isTerminated(): Devuelve true si todas las tareas se completaron después del cierre.
  • awaitTermination(): Se bloquea durante un período hasta que se completa todo el trabajo después del cierre.

Casos de múltiples clientes

Puede haber casos de uso específicos del cliente que justifiquen la existencia simultánea de varias instancias de una biblioteca cliente. El principal caso de uso para tener varios clientes es cuando hay solicitudes que se deben enviar a varios extremos diferentes. Una instancia de cliente se conecta a un solo extremo. Para conectarte a varios extremos, crea un cliente para cada uno.

Riesgos potenciales para varias cuentas de clientes

Existen algunos riesgos comunes con las aplicaciones que usan varias instancias de bibliotecas cliente:

  • Mayor potencial de fugas de memoria Los recursos persisten si no se cierran correctamente todas las instancias del cliente.
  • Implicaciones de rendimiento. Inicializar varios canales de gRPC genera un costo de rendimiento, que puede acumularse en aplicaciones sensibles al rendimiento.
  • Problemas con las solicitudes en curso. Cerrar un cliente mientras las solicitudes aún están en curso puede generar un RejectedExecutionException. Asegúrate de que las solicitudes se completen antes de cerrar el cliente.