Datenbankleistung optimieren

Es gibt verschiedene Möglichkeiten, die Firebase Realtime Database Leistung in Ihrer App zu verbessern. Um herauszufinden, wie Sie Ihre Realtime Database Leistung optimieren können, erheben Sie Daten mit den verschiedenen Realtime Database Überwachungstools und nehmen Sie dann entsprechende Änderungen an Ihrer App oder der Realtime Database Verwendung vor.

Leistung von Realtime Database überwachen

Je nach gewünschtem Detaillierungsgrad können Sie Daten zur Leistung Ihrer Realtime Database's mit verschiedenen Tools erheben:

  • Allgemeiner Überblick:Verwenden Sie das Profiler-Tool für eine Liste der nicht indexierten Abfragen und einen Echtzeitüberblick über Lese-/Schreibvorgänge.
  • Geschätzte kostenpflichtige Nutzung: In der Firebase Console finden Sie Nutzungsmesswerte, mit denen Sie Ihre kostenpflichtige Nutzung und allgemeine Leistungsmesswerte einsehen können.
  • Detaillierte Analyse: Mit Cloud Monitoring können Sie die Leistung Ihrer Datenbank im Zeitverlauf genauer analysieren.

Leistung nach Messwert verbessern

Nachdem Sie Daten erhoben haben, können Sie die folgenden Best Practices und Strategien je nach Leistungsbereich anwenden, den Sie verbessern möchten.

Strategien zur Leistungsverbesserung auf einen Blick
Messwert Beschreibung Best Practices
Last/Auslastung Optimieren Sie, wie viel Kapazität Ihrer Datenbank zu einem bestimmten Zeitpunkt für die Verarbeitung von Anfragen verwendet wird (wird in den Messwerten **Last** oder **io/database_load** widergespiegelt). Datenstruktur optimieren
Daten auf mehrere Datenbanken verteilen
Listener-Effizienz verbessern
Downloads mit abfragebasierten Regeln begrenzen
Verbindungen optimieren
Aktive Verbindungen Sorgen Sie für ein ausgewogenes Verhältnis zwischen der Anzahl der gleichzeitigen aktiven Verbindungen zu Ihrer Datenbank, damit das Limit von 200.000 Verbindungen nicht überschritten wird. Daten auf mehrere Datenbanken verteilen
Anzahl neuer Verbindungen reduzieren
Ausgehende Bandbreite Wenn die Downloads aus Ihrer Datenbank höher als gewünscht sind, können Sie die Effizienz Ihrer Lesevorgänge verbessern und den Verschlüsselungsaufwand reduzieren. Verbindungen optimieren
Datenstruktur optimieren
Downloads mit abfragebasierten Regeln begrenzen
SSL-Sitzungen wiederverwenden
Listener-Effizienz verbessern
Datenzugriff einschränken
Speicher Achten Sie darauf, dass Sie keine ungenutzten Daten speichern, oder verteilen Sie Ihre gespeicherten Daten auf andere Datenbanken und/oder Firebase-Produkte, um das Kontingent nicht zu überschreiten. Ungenutzte Daten bereinigen
Datenstruktur optimieren
Daten auf mehrere Datenbanken verteilen
Verwenden Sie Cloud Storage for Firebase

Verbindungen optimieren

Für RESTful-Anfragen wie GET und PUT ist weiterhin eine Verbindung erforderlich, auch wenn diese nur kurzlebig ist. Diese häufigen, kurzlebigen Verbindungen können zu deutlich höheren Verbindungskosten, Datenbanklast und ausgehender Bandbreite führen als aktive Echtzeitverbindungen 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 Kosten für die SSL-Verschlüsselung und die Datenbanklast reduziert werden, die bei der REST API anfallen können.

Wenn Sie die REST API verwenden, sollten Sie HTTP-Keep-Alive verwenden, um eine offene Verbindung aufrechtzuerhalten, oder Server-Sent Events nutzen, um die Kosten für SSL-Handshakes zu senken.

Daten auf mehrere Datenbanken verteilen

Wenn Sie Ihre Daten auf mehrere Realtime Database Instanzen verteilen ( Datenbank-Sharding), bietet das drei Vorteile:

  1. Sie können die Anzahl der zulässigen gleichzeitigen aktiven Verbindungen für Ihre App erhöhen, indem Sie sie auf mehrere Datenbankinstanzen verteilen.
  2. Die Last wird auf mehrere Datenbankinstanzen verteilt.
  3. Wenn Sie unabhängige Nutzergruppen haben, die nur Zugriff auf bestimmte Datensätze benötigen, verwenden Sie verschiedene Datenbankinstanzen, um den Durchsatz zu erhöhen und die Latenz zu verringern.

Wenn Sie den Blaze-Tarif nutzen, können Sie mehrere Datenbankinstanzen im selben Firebase-Projekt erstellen und eine gemeinsame Methode zur Nutzer authentifizierung für alle Datenbankinstanzen verwenden.

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 selbst 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 Clients herunterladen zu müssen.

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

Außerdem kann jeder Schreibvorgang 0, 1% der Gesamtauslastung Ihrer Datenbank in Anspruch nehmen. Strukturieren Sie Ihre Daten so, dass Sie Schreibvorgänge in einem einzigen Vorgang zusammenfassen können, z. B. als Updates für mehrere Pfade mit den Methoden update() in den SDKs oder mit RESTful-PATCH-Anfragen.

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

Unbefugten Zugriff verhindern

Verhindern Sie unbefugte Vorgänge in Ihrer Datenbank mit Realtime Database Security Rules. Mit Regeln können Sie beispielsweise verhindern, dass ein böswilliger Nutzer Ihre gesamte Datenbank wiederholt herunterlädt.

Weitere Informationen zur Verwendung von Firebase Realtime Database-Regeln.

Downloads mit abfragebasierten Regeln begrenzen

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

Die folgende Regel beschränkt den Lesezugriff beispielsweise auf die ersten 1.000 Ergebnisse einer Abfrage, sortiert nach Priorität:

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

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

Weitere Informationen zu Realtime Database Security Rules

Abfragen indexieren

Durch das Indexieren Ihrer Daten wird die Gesamtbandbreite reduziert, die für jede Abfrage verwendet wird, die Ihre App ausführt.

SSL-Sitzungen wiederverwenden

Sie können die Kosten für die SSL-Verschlüsselung bei wiederaufgenommenen Verbindungen reduzieren, indem Sie TLS-Sitzungstickets ausstellen. Das ist besonders hilfreich, wenn Sie häufig sichere Verbindungen zur Datenbank benötigen.

Listener-Effizienz verbessern

Platzieren Sie Ihre Listener so weit unten im Pfad wie möglich, um die Menge der Daten zu begrenzen, die sie synchronisieren. Listener sollten sich in der Nähe der Daten befinden, die sie abrufen sollen. Listener sollten nicht im Stammverzeichnis der Datenbank platziert werden, da sonst die gesamte Datenbank heruntergeladen wird.

Fügen Sie Abfragen hinzu, um die Daten zu begrenzen, die von Ihren Listener-Vorgängen zurückgegeben werden, und verwenden Sie Listener, die nur Datenupdates herunterladen, z. B. on() anstelle von once(). Verwenden Sie .once() nur für Aktionen, für die keine Datenupdates erforderlich sind. Sortieren Sie Ihre Abfragen nach Möglichkeit mit orderByKey(), um die beste Leistung zu erzielen. Das Sortieren mit orderByChild() kann 6- bis 8-mal langsamer sein und das Sortieren mit orderByValue() kann bei großen Datensätzen sehr langsam sein, da die gesamte Position aus der Persistenzebene gelesen werden muss.

Fügen Sie Listener außerdem dynamisch hinzu und entfernen Sie sie, wenn sie nicht mehr benötigt werden.

Ungenutzte Daten bereinigen

Entfernen Sie regelmäßig alle ungenutzten oder doppelten Daten in Ihrer Datenbank. Sie können Back-ups ausführen, um Ihre Daten manuell zu prüfen oder regelmäßig in einem Google Cloud Storage Bucket zu sichern. Sie können gespeicherte Daten auch über Cloud Storage for Firebase hosten.

Skalierbaren Code bereitstellen, den Sie aktualisieren können

Apps, die in IoT-Geräte eingebettet sind, sollten skalierbaren Code enthalten, den Sie einfach aktualisieren können. Testen Sie Anwendungsfälle gründlich, berücksichtigen Sie Szenarien, in denen Ihre Nutzerbasis exponentiell wachsen könnte, und bauen Sie die Möglichkeit ein, Updates für Ihren Code bereitzustellen. Überlegen Sie sich genau, welche größeren Änderungen Sie möglicherweise in Zukunft vornehmen müssen, z. B. wenn Sie Ihre Daten verteilen möchten.