Datenbankleistung optimieren

Es gibt verschiedene Möglichkeiten, die Firebase Realtime DatabaseLeistung Ihrer App zu verbessern. Wenn Sie herausfinden möchten, wie Sie die Realtime DatabaseLeistung optimieren können, erheben Sie Daten mithilfe der verschiedenen Realtime DatabaseMonitoring-Tools und nehmen Sie dann entsprechende Änderungen an Ihrer App oder Nutzung vor.Realtime Database

Leistung von Realtime Database beobachten

Je nach gewünschter Detaillierung können Sie Daten zur Leistung Ihrer Realtime Database mit verschiedenen Tools erfassen:

  • Übersicht:Im Profiler-Tool finden Sie eine Liste der nicht indexierten Abfragen und eine Echtzeitübersicht der Lese-/Schreibvorgänge.
  • Geschätzte in Rechnung gestellte Nutzung:Mit den Nutzungsmesswerten in der Firebase Console können Sie die in Rechnung gestellte Nutzung und Leistungsmesswerte auf einen Blick sehen.
  • Detaillierter Drilldown:Mit Cloud Monitoring können Sie sich die Leistung Ihrer Datenbank im Zeitverlauf genauer ansehen.

Leistung nach Messwert verbessern

Nachdem Sie Daten erfasst haben, können Sie die folgenden Best Practices und Strategien für den Leistungsbereich, den Sie verbessern möchten, ausprobieren.

Strategien zur Leistungssteigerung
Messwert Beschreibung Best Practices
Auslastung Optimieren Sie, wie viel der Kapazität Ihrer Datenbank zu einem bestimmten Zeitpunkt für die Verarbeitung von Anfragen verwendet wird (wird in den Messwerten „Load“ oder „io/database_load“ angezeigt). Datenstruktur optimieren
Daten über mehrere Datenbanken hinweg partitionieren
Effizienz von Zuhörern verbessern
Downloads mit abfragebasierten Regeln begrenzen
Verbindungen optimieren
Aktive Verbindungen Achten Sie darauf, dass die Anzahl der gleichzeitigen aktiven Verbindungen zu Ihrer Datenbank unter 200.000 liegt. Daten in mehreren Datenbanken speichern
Neue Verbindungen reduzieren
Ausgehende Bandbreite Wenn die Downloads aus Ihrer Datenbank höher sind als gewünscht, können Sie die Effizienz Ihrer Lesevorgänge verbessern und den Verschlüsselungsoverhead reduzieren. Verbindungen optimieren
Datenstruktur optimieren
Downloads mit abfragebasierten Regeln begrenzen
SSL-Sitzungen wiederverwenden
Effizienz von Listenern verbessern
Zugriff auf Daten einschränken
Speicher Achten Sie darauf, keine nicht verwendeten Daten zu speichern, oder verteilen Sie Ihre gespeicherten Daten auf andere Datenbanken und/oder Firebase-Produkte, um das Kontingent nicht zu überschreiten. Nicht verwendete Daten bereinigen
Datenstruktur optimieren
Daten über mehrere Datenbanken hinweg fragmentieren
Cloud Storage for Firebase verwenden

Verbindungen optimieren

RESTful-Anfragen wie GET und PUT erfordern weiterhin eine Verbindung, auch wenn diese kurzlebig ist. Diese häufigen, kurzlebigen Verbindungen können zu deutlich höheren Verbindungskosten, einer höheren Datenbankauslastung und einer höheren ausgehenden Bandbreite führen als Echtzeit-aktive Verbindungen zu Ihrer Datenbank.

Verwenden Sie nach Möglichkeit die nativen SDKs für die Plattform Ihrer App anstelle der REST API. Die SDKs halten offene Verbindungen aufrecht, wodurch die SSL-Verschlüsselungskosten und die Datenbanklast reduziert werden, die sich bei der REST API summieren können.

Wenn Sie die REST API verwenden, sollten Sie ein HTTP-Keep-Alive verwenden, um eine offene Verbindung aufrechtzuerhalten, oder servergesendete Ereignisse, um die Kosten für SSL-Handshakes zu senken.

Daten auf mehrere Datenbanken verteilen

Das Aufteilen Ihrer Daten auf mehrere Realtime Database-Instanzen, auch als Datenbank-Sharding bezeichnet, bietet drei Vorteile:

  1. Erhöhen Sie die Gesamtzahl der simultanen, aktiven Verbindungen, die in Ihrer Anwendung zulässig sind, indem Sie sie auf Datenbankinstanzen aufteilen.
  2. Last auf Datenbankinstanzen verteilen
  3. Wenn Sie unabhängige Nutzergruppen haben, die nur Zugriff auf bestimmte Datensätze benötigen, verwenden Sie verschiedene Datenbankinstanzen für einen höheren Durchsatz und eine geringere Latenz.

Wenn Sie das Blaze-Preismodell haben, können Sie mehrere Datenbankinstanzen innerhalb desselben Firebase-Projekts erstellen und dafür eine gemeinsame Methode zur Nutzerauthentifizierung für alle Datenbankinstanzen nutzen.

Weitere Informationen zum Sharding von Daten

Effiziente Datenstrukturen erstellen

Da Realtime Database die Daten sowohl von den untergeordneten Knoten eines Pfads als auch von dem Pfad abruft, ist es sinnvoll, die Datenstruktur so flach wie möglich zu halten. So können Sie die benötigten Daten selektiv abrufen, ohne unnötige Daten auf die Clients herunterzuladen.

Berücksichtigen Sie beim Strukturieren Ihrer Daten insbesondere Schreib- und Löschvorgänge. Beispielsweise kann das Löschen von Pfaden mit Tausenden von Blättern teuer sein. Wenn Sie sie in Pfade mit mehreren untergeordneten Bäumen und weniger Blättern pro Knoten aufteilen, können Sie das Löschen beschleunigen.

Darüber hinaus kann jeder Schreibvorgang 0, 1% Ihrer gesamten Datenbanknutzung in Anspruch nehmen. Strukturieren Sie Ihre Daten so, dass Sie Batch-Schreibvorgänge in einem einzigen Vorgang als Multipath-Aktualisierungen über die update()-Methoden in den SDKs oder RESTful PATCH-Anfragen ausführen können.

Beachten Sie die Best Practices für Datenstrukturen, um die Datenstruktur zu optimieren und die Leistung zu verbessern.

Unbefugten Zugriff verhindern

Mit Realtime Database Security Rules verhindern Sie nicht autorisierte Vorgänge in Ihrer Datenbank. Mithilfe von Regeln lässt sich beispielsweise verhindern, dass ein böswilliger Nutzer wiederholt Ihre gesamte Datenbank herunterlädt.

Weitere Informationen zur Verwendung von Firebase Realtime Database-Regeln

Abfragebasierte Regeln zum Einschränken von Downloads verwenden

Realtime Database Security Rules schränken den Zugriff auf Daten in Ihrer Datenbank ein, können aber auch als Grenzwerte für Daten dienen, die über Lesevorgänge zurückgegeben werden. Wenn Sie abfragebasierte Regeln verwenden, die durch query.-Ausdrücke wie query.limitToFirst definiert sind, werden in Abfragen nur die Daten abgerufen, die durch die Regel begrenzt sind.

Mit der folgenden Regel wird der Lesezugriff beispielsweise auf die ersten 1.000 Ergebnisse einer Abfrage beschränkt, die nach Priorität sortiert sind:

messages: {
  ".read": "query.orderByKey &&
            query.limitToFirst <= 1000"
}

// Example query:
db.ref("messages").limitToFirst(1000)
                  .orderByKey("value")

Weitere Informationen zu Realtime Database Security Rules

Indexabfragen

Durch das Indexieren Ihrer Daten wird die Gesamtbandbreite reduziert, die Sie für jede Abfrage in Ihrer App verwenden.

SSL-Sitzungen wiederverwenden

Reduzieren Sie die SSL-Verschlüsselungskosten bei fortgesetzten Verbindungen, indem Sie TLS-Sitzungstickets ausstellen. Das ist besonders hilfreich, wenn Sie häufige, sichere Verbindungen zur Datenbank benötigen.

Effizienz der Zuhörer steigern

Platzieren Sie die Listener so weit wie möglich im Pfad, um die Datenmenge zu begrenzen, die sie synchronisieren. Ihre Zuhörer sollten sich in der Nähe der Daten befinden, die sie erhalten sollen. Hören Sie nicht am Stammverzeichnis der Datenbank, da dies zum Herunterladen der gesamten Datenbank führt.

Fügen Sie Abfragen hinzu, um die Daten einzuschränken, die von Ihren aktiven Abfragen zurückgegeben werden, und verwenden Sie Listener, die nur Datenaktualisierungen herunterladen, z. B. on() anstelle von once(). Verwenden Sie .once() nur für Aktionen, die keine Datenaktualisierungen erfordern. Außerdem sollten Sie Abfragen nach Möglichkeit mit orderByKey() sortieren, um die beste Leistung zu erzielen. Die Sortierung mit orderByChild() kann 6- bis 8-mal langsamer sein und die Sortierung mit orderByValue() kann bei großen Datensätzen sehr langsam sein, da der gesamte Speicherort aus der Speicherebene gelesen werden muss.

Achten Sie darauf, Listener auch dynamisch hinzuzufügen und sie zu entfernen, wenn sie nicht mehr benötigt werden.

Nicht verwendete Daten bereinigen

Entfernen Sie regelmäßig nicht verwendete oder doppelte Daten aus Ihrer Datenbank. Sie können Sicherungen ausführen, um Ihre Daten manuell zu prüfen oder sie regelmäßig in einem Google Cloud Storage-Bucket zu sichern. Sie können auch über Cloud Storage for Firebase gespeicherte Daten hosten.

Skalierbaren Code veröffentlichen, den Sie aktualisieren können

In IoT-Geräte integrierte Anwendungen sollten skalierbaren Code enthalten, den Sie einfach aktualisieren können. Testen Sie Anwendungsfälle gründlich, berücksichtigen Sie Szenarien, in denen sich Ihre Nutzerbasis exponentiell vergrößern könnte, und bauen Sie die Möglichkeit ein, Updates für Ihren Code bereitzustellen. Überlegen Sie sorgfältig, welche größeren Änderungen Sie später vornehmen müssen, wenn Sie sich beispielsweise dazu entschließen, Ihre Daten zu trennen.