Gestire i cicli di vita dei client nelle librerie client Java Cloud

Le istanze della libreria client sono riutilizzabili e progettate per durare a lungo. In genere, le applicazioni mantengono una singola istanza di una libreria client, anziché creare una libreria per ogni richiesta.

Utilizzando Java-KMS come esempio, il seguente snippet mostra più richieste richiamate con la stessa istanza client:

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

Chiudere un client

La gestione del ciclo di vita di un client può dipendere dal caso d'uso e dalla libreria client specifica. Ad esempio, se utilizzi un framework, segui le linee guida del framework per la gestione dei client. Anche se in alcuni scenari potrebbe essere utilizzato try-with-resources per client di durata inferiore, in genere è consigliabile riutilizzare un'istanza client di lunga durata per efficienza

La chiamata di close() su un client tenta un arresto controllato e garantisce che le attività esistenti continuino fino al completamento. Il cliente non accetterà nuovi incarichi. Se non chiudi il client, le sue risorse continuano a esistere e la tua applicazione subisce perdite di memoria.

L'esempio seguente utilizza Java-KMS e mostra la chiusura del client:

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

Oltre a close(), alcune librerie client Java espongono alcuni metodi correlati per la gestione del ciclo di vita del client:

  • shutdown(): equivalente a close().
  • shutdownNow(): richiama immediatamente la procedura di arresto. Interrompe tutte le attività in esecuzione e non attende il completamento dell'attività.
  • isShutdown(): restituisce true se le attività in background sono state arrestate.
  • isTerminated(): restituisce true se tutte le attività sono state completate dopo l'arresto.
  • awaitTermination(): Blocca per una durata fino al completamento di tutto il lavoro dopo l'arresto.

Casi per più clienti

Possono esistere casi d'uso specifici per i clienti che giustificano la coesistenza di più istanze di una libreria client. Il caso d'uso principale per avere più client si verifica quando ci sono richieste che devono essere inviate a più endpoint diversi. Un'istanza client si connette a un singolo endpoint. Per connetterti a più endpoint, crea un client per ognuno.

Potenziali rischi multi-cliente

Esistono alcuni rischi comuni con le applicazioni che utilizzano più istanze della libreria client:

  • Maggiore potenziale di perdite di memoria. Le risorse rimangono attive se non tutte le istanze client vengono chiuse correttamente.
  • Implicazioni sul rendimento. L'inizializzazione di più canali gRPC comporta un costo in termini di prestazioni, che può aumentare nelle applicazioni sensibili alle prestazioni.
  • Problemi con le richieste in corso. La chiusura di un client mentre le richieste sono ancora in corso può comportare un RejectedExecutionException. Assicurati che le richieste vengano completate prima di chiudere il client.