Der Java-Client für den Datastore-Modus bietet gRPC als Transportebene an. Durch die Verwendung von gRPC-Verbindungs-Pooling können RPCs auf mehrere Verbindungen verteilt werden, was die Leistung verbessern kann.
Hinweise
Installieren Sie die aktuelle Version der google-cloud-datastore
-Bibliothek.
gRPC-Transportverhalten aktivieren
Um das gRPC-Transportverhalten zu aktivieren, fügen Sie setTransportOptions
in die Client-Instanziierung ein:
Java
DatastoreOptions datastoreOptions = DatastoreOptions.newBuilder() .setProjectId("my-project") .setDatabaseId("my-database") .setTransportOptions(GrpcTransportOptions.newBuilder().build()) .build();
Wenn Sie die Transportoptionen explizit auf GrpcTransportOptions
festlegen, wird der Client so konfiguriert, dass er gRPC anstelle von HTTP verwendet, wenn er Aufrufe an den Server sendet.
gRPC-Transportverhalten deaktivieren
Sie können das gRPC-Transportverhalten deaktivieren, indem Sie zum HTTP-Transportverhalten zurückkehren. Entfernen Sie dazu die Codezeile .setTransportOptions
oder ersetzen Sie GrpcTransportOptions
durch HttpTransportOptions
.
Sie müssen Ihre Anwendung auch neu erstellen und neu starten.
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();
Transportmöglichkeiten prüfen
So prüfen Sie, welchen Typ von TransportOptions
der Client verwendet:
Java
// Compares datastore transport options type boolean isGRPC = datastore.getOptions().getTransportOptions() instanceof GrpcTransportOptions; boolean isHTTP = datastore.getOptions().getTransportOptions() instanceof HTTPTransportOptions;
Konfiguration von Verbindungspools
Ein Verbindungspool, auch als Kanalpool bezeichnet, ist ein Cache aus Datenbankverbindungen, die der Client gemeinsam nutzt und wiederverwendet, um die Verbindungslatenz und -leistung zu verbessern. Konfigurieren Sie den Verbindungspool, um die Leistung Ihrer Anwendung zu verbessern.
In diesem Abschnitt erfahren Sie, wie Sie die optimale Größe des Verbindungspools ermitteln und wie Sie ihn in der Java-Clientbibliothek konfigurieren.
Optimale Größe des Verbindungspools ermitteln
Die Standardgröße des Verbindungspools ist für die meisten Anwendungen geeignet und in den meisten Fällen muss sie nicht geändert werden. Möglicherweise möchten Sie die Größe des Verbindungspools jedoch aufgrund von hohem Durchsatz oder gepufferten Anfragen ändern.
Um Spielraum für Trafficschwankungen zu schaffen, wird für den Verbindungspool idealerweise etwa die doppelte Anzahl von Verbindungen benötigt, die für die maximale Sättigung erforderlich sind. Da eine Verbindung maximal 100 gleichzeitige Anfragen verarbeiten kann, empfehlen wir, dass Sie zwischen 10 und 50 ausstehende Anfragen pro Verbindung haben. Das Limit von 100 gleichzeitigen Streams pro gRPC-Verbindung wird auf der Middleware-Ebene erzwungen und kann nicht konfiguriert werden. So berechnen Sie die optimale Anzahl von Verbindungen in Ihrem Verbindungspool anhand einer geschätzten QPS pro Client und durchschnittlichen Latenzzahlen:
Ermitteln Sie aus Ihren clientseitigen Messwerten die folgenden Informationen und führen Sie die folgenden Berechnungen durch:
- Bestimmen Sie die maximale Anzahl von Abfragen pro Sekunde (QPS) pro Client, wenn Ihre Anwendung eine Arbeitslast ausführt.
- Bestimmen Sie die durchschnittliche Latenz (die Antwortzeit für eine einzelne Anfrage) in ms.
- Bestimmen Sie die Anzahl der Anfragen, die Sie nacheinander pro Sekunde senden können, indem Sie 1.000 durch den durchschnittlichen Latenzwert teilen.
- Teilen Sie die Abfragen pro Sekunde durch die Anzahl der seriellen Anfragen pro Sekunde.
- Teilen Sie das Ergebnis durch 50 Anfragen pro Kanal, um die minimale optimale Größe des Verbindungspools zu ermitteln. Wenn Ihre Berechnung weniger als 2 ergibt, verwenden Sie trotzdem mindestens zwei Kanäle, um Redundanz zu gewährleisten.
- Teilen Sie dasselbe Ergebnis durch 10 Anfragen pro Kanal, um die maximale optimale Größe des Verbindungspools zu ermitteln.
Verwenden Sie die folgenden Gleichungen, um diese Schritte auszuführen:
(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
Angenommen, Ihre Anwendung sendet in der Regel 50.000 Anfragen pro Sekunde und die durchschnittliche Latenz beträgt 10 ms. Teilen Sie 1.000 durch 10 ms, um festzustellen, dass Sie 100 Anfragen nacheinander pro Sekunde senden können. Teilen Sie 50.000 durch diese Zahl,um die Parallelität zu erhalten,die zum Senden von 50.000 QPS erforderlich ist: 500.
Jeder Kanal kann höchstens 100 Anfragen gleichzeitig ausführen und Ihre Zielkanalauslastung liegt zwischen 10 und 50 gleichzeitigen Streams. Zur Berechnung der Mindestgröße des Verbindungspools teilen Sie daher 500 durch 50 und erhalten 10. Um die maximale Größe des Verbindungspools zu ermitteln, teilen Sie 500 durch 10. Sie erhalten dann 50.
Das bedeutet, dass die Größe des Verbindungspools in diesem Beispiel zwischen 10 und 50 Verbindungen liegt. Es ist auch wichtig, dass Sie den Traffic nach diesen Änderungen im Blick behalten und die Anzahl der Verbindungen in Ihrem Pool bei Bedarf anpassen.
Poolgröße festlegen
Das folgende Codebeispiel zeigt, wie Sie den Verbindungspool in den Clientbibliotheken mit DatastoreOptions
konfigurieren.
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();
Nächste Schritte
Weitere Informationen zu Verbindungspools und Best Practices für die Leistung finden Sie unter: