Il client Java per la modalità Datastore offre gRPC come opzione di livello di trasporto. L'utilizzo del pool di connessioni gRPC consente di distribuire le RPC su più connessioni, il che può migliorare le prestazioni.
Prima di iniziare
Installa
l'ultima versione della libreria google-cloud-datastore
.
Come attivare il comportamento di trasporto gRPC
Per attivare il comportamento di trasporto gRPC, aggiungi setTransportOptions
all'istanza del client:
Java
DatastoreOptions datastoreOptions = DatastoreOptions.newBuilder() .setProjectId("my-project") .setDatabaseId("my-database") .setTransportOptions(GrpcTransportOptions.newBuilder().build()) .build();
Se imposti esplicitamente le opzioni di trasporto su GrpcTransportOptions
, il client utilizzerà gRPC anziché HTTP quando effettua chiamate al server.
Disattiva il comportamento di trasporto gRPC
Puoi disattivare il comportamento di trasporto gRPC ripristinando il comportamento di trasporto HTTP. Per farlo, rimuovi la
riga di codice .setTransportOptions
o sostituisci GrpcTransportOptions
con HttpTransportOptions
.
Devi anche ricompilare e riavviare l'applicazione.
Java
// Use this code to deactivate the gRPC transport behavior // by reverting to the HTTP transport behavior. DatastoreOptions datastoreOptions = DatastoreOptions.newBuilder() .setProjectId("my-project") .setDatabaseId("my-database") .build(); // You can also use this code to revert to the HTTP transport behavior DatastoreOptions datastoreOptions = DatastoreOptions.newBuilder() .setProjectId("my-project") .setDatabaseId("my-database") .setTransportOptions(HttpTransportOptions.newBuilder() .setConnectTimeout(1000) .build()) .build();
Verificare le opzioni di trasporto
Per verificare il tipo di TransportOptions
utilizzato dal client, esamina
il tipo di opzioni di trasporto:
Java
// Compares datastore transport options type boolean isGRPC = datastore.getOptions().getTransportOptions() instanceof GrpcTransportOptions; boolean isHTTP = datastore.getOptions().getTransportOptions() instanceof HTTPTransportOptions;
Configurazione del pool di connessioni
Un pool di connessioni, noto anche come pool di canali, è una cache di connessioni al database che il client condivide e riutilizza per migliorare la latenza e le prestazioni della connessione. Per migliorare le prestazioni dell'applicazione, configura il pool di connessioni.
Questa sezione ti aiuta a determinare la dimensione ottimale del pool di connessioni e mostra come configurarlo all'interno della libreria client Java.
Determinare le dimensioni migliori del pool di connessioni
La dimensione predefinita del pool di connessioni è adatta alla maggior parte delle applicazioni e nella maggior parte dei casi non è necessario modificarla. Tuttavia, potresti voler modificare le dimensioni del pool di connessioni a causa dell'elevato throughput o delle richieste memorizzate nel buffer.
Idealmente, per lasciare spazio alle fluttuazioni del traffico, un pool di connessioni ha circa il doppio delle connessioni necessarie per la saturazione massima. Poiché una connessione può gestire un massimo di 100 richieste simultanee, ti consigliamo di avere tra 10 e 50 richieste in sospeso per connessione. Il livello middleware applica il limite di 100 stream simultanei per connessione gRPC e questo limite non è configurabile. Per calcolare il numero ottimale di connessioni nel pool di connessioni utilizzando una stima di QPS per client e i numeri di latenza media, procedi nel seguente modo:
Dalle metriche lato client, raccogli le seguenti informazioni ed esegui i seguenti calcoli:
- Determina il numero massimo di query al secondo (QPS) per client quando la tua applicazione esegue un workload.
- Determina la latenza media (il tempo di risposta per una singola richiesta) in ms.
- Determina il numero di richieste che puoi inviare in serie al secondo dividendo 1000 per il valore di latenza media.
- Dividi le QPS in secondi per il numero di richieste seriali al secondo.
- Dividi il risultato per 50 richieste per canale per determinare le dimensioni minime ottimali del pool di connessioni. (Se il risultato è inferiore a 2, utilizza comunque almeno 2 canali per garantire la ridondanza.)
- Dividi lo stesso risultato per 10 richieste per canale per determinare la dimensione ottimale massima del pool di connessioni.
Per eseguire questi passaggi, utilizza le seguenti equazioni:
(QPS sec ÷ (1,000 ÷ latency ms)) ÷ 50 streams = Minimum optimal number of
connections
(QPS sec ÷ (1,000 ÷ latency ms)) ÷ 10 streams = Maximum optimal number of
connections
Ad esempio, se la tua applicazione in genere invia 50. 000 richieste al secondo e la latenza media è di 10 ms, dividi 1000 per 10 ms per determinare che puoi inviare 100 richieste in serie al secondo. Dividi questo numero per 50.000 per ottenere il parallelismo necessario per inviare 50.000 QPS: 500.
Ogni canale può avere al massimo 100 richieste in parallelo e l'utilizzo del canale di destinazione è tra 10 e 50 stream simultanei. Pertanto, per calcolare la dimensione minima del pool di connessioni, dividi 500 per 50 per ottenere 10. Per trovare la dimensione massima del pool di connessioni, dividi 500 per 10 per ottenere 50.
Ciò significa che la dimensione del pool di connessioni per questo esempio è compresa tra 10 e 50 connessioni. È anche importante monitorare il traffico dopo aver apportato queste modifiche e regolare il numero di connessioni nel pool, se necessario.
Imposta le dimensioni del pool
Il seguente esempio di codice mostra come configurare il pool di connessioni nelle librerie client utilizzando DatastoreOptions
.
Java
InstantiatingGrpcChannelProvider channelProvider = DatastoreSettings.defaultGrpcTransportProviderBuilder() .setChannelPoolSettings( ChannelPoolSettings.builder() .setInitialChannelCount(MIN_VAL) .setMaxChannelCount(MAX_VAL) .build()) .build(); DatastoreOptions options = DatastoreOptions.newBuilder() .setProjectId("my-project") .setChannelProvider(channelProvider) .setTransportOptions(GrpcTransportOptions.newBuilder().build()) .build();
Passaggi successivi
Per saperne di più sui pool di connessioni e sulle best practice per le prestazioni, consulta: