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 aclose().shutdownNow(): richiama immediatamente la procedura di arresto. Interrompe tutte le attività in esecuzione e non attende il completamento dell'attività.isShutdown(): restituiscetruese le attività in background sono state arrestate.isTerminated(): restituiscetruese 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.