Datenbankleistung optimieren

Es gibt verschiedene Möglichkeiten, die Firebase Realtime Database-Leistung in Ihrer Anwendung zu verbessern. Wenn Sie wissen möchten, wie Sie die Realtime Database-Leistung optimieren können, erfassen Sie Daten mit den verschiedenen Realtime Database-Monitoring-Tools und nehmen Sie dann entsprechende Änderungen an Ihrer Anwendung oder Realtime Database-Nutzung vor.

Leistung von Realtime Database überwachen

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

  • Allgemeine Übersicht: Verwenden Sie das Profiler-Tool, um eine Liste der nicht indexierten Abfragen und eine Echtzeitübersicht der Lese-/Schreibvorgänge zu erhalten.
  • Schätzung der abgerechneten Nutzung: Verwenden Sie die Nutzungsmesswerte, die in der Firebase Console verfügbar sind, um Ihre abgerechnete Nutzung und allgemeine Leistungsmesswerte aufzurufen.
  • Detaillierter Drilldown: Verwenden Sie Cloud Monitoring, um sich die Leistung Ihrer Datenbank im Zeitverlauf genauer anzusehen.

Leistung nach Messwert verbessern

Nachdem Sie Daten erhoben haben, können Sie sich die folgenden Best Practices und Strategien ansehen, die auf dem Leistungsbereich basieren, den Sie verbessern möchten.

Strategien zur Leistungsverbesserung auf einen Blick
Messwert Beschreibung Best Practices
Last/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 **Last** oder **io/database_load** angezeigt). Datenstruktur optimieren
Daten auf mehrere Datenbanken verteilen
Effizienz von Listenern verbessern
Downloads mit abfragebasierten Regeln einschränken
Verbindungen optimieren
Aktive Verbindungen Gleichen Sie die Anzahl der gleichzeitigen, aktiven Verbindungen zu Ihrer Datenbank aus,um das Limit von 200.000 Verbindungen nicht zu überschreiten. Daten auf mehrere Datenbanken verteilen
Neue Verbindungen reduzieren
ausgehende Bandbreite Wenn die Downloads aus Ihrer Datenbank höher sind, als Sie möchten, können Sie die Effizienz Ihrer Lesevorgänge verbessern und den Verschlüsselungsaufwand reduzieren. Verbindungen optimieren
Datenstruktur optimieren
Downloads mit abfragebasierten Regeln einschränken
SSL-Sitzungen wiederverwenden
Listener-Effizienz verbessern
Zugriff auf Daten 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. Nicht verwendete Daten bereinigen
Datenstruktur optimieren
Daten auf mehrere Datenbanken verteilen
Cloud Storage for Firebase verwenden

Verbindungen optimieren

Für RESTful-Anfragen wie GET und PUT ist weiterhin eine Verbindung erforderlich, auch wenn diese Verbindung nur kurzlebig ist. Diese häufigen, kurzlebigen Verbindungen können tatsächlich 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 Verbindungen offen, was die SSL-Verschlüsselungskosten und die Datenbanklast reduziert, 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 vom Server gesendete Ereignisse verwenden, um die Kosten für SSL-Handshakes zu reduzieren.

Daten auf mehrere Datenbanken verteilen

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

  1. Erhöhen Sie die Gesamtzahl der gleichzeitigen, 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 separate Datasets benötigen, verwenden Sie verschiedene Datenbankinstanzen, um einen höheren Durchsatz und eine geringere Latenz zu erzielen.

Wenn Sie das Blaze-Preismodell nutzen, können Sie mehrere Datenbankinstanzen im selben Firebase-Projekt erstellen und eine gemeinsame Nutzerauthentifizierungsmethode 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 vom 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 herunterzuladen.

Berücksichtigen Sie beim Strukturieren Ihrer Daten insbesondere Schreib- und Löschvorgänge. Pfade mit Tausenden von Blättern sind beispielsweise potenziell teuer zu löschen. Wenn Sie sie in Pfade mit mehreren Unterbäumen und weniger Blättern pro Knoten aufteilen, können Sie Löschvorgänge beschleunigen.

Außerdem kann jeder Schreibvorgang bis zu 0, 1% der gesamten Datenbankauslastung in Anspruch nehmen. Strukturieren Sie Ihre Daten so, dass Sie Schreibvorgänge in einem einzigen Vorgang als Multipfad-Updates über die update()-Methoden in den SDKs oder RESTful-PATCH-Anfragen zusammenfassen können.

Wenn Sie Ihre Datenstruktur optimieren und die Leistung verbessern möchten, folgen Sie den Best Practices für Datenstrukturen.

Unbefugten Zugriff verhindern

Verhindern Sie mit Realtime Database Security Rules nicht autorisierte Vorgänge in Ihrer Datenbank. Mithilfe von 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

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 Limits 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 sind, rufen Abfragen nur die Daten ab, die durch die Regel begrenzt sind.

Mit der folgenden Regel wird der Lesezugriff beispielsweise auf die ersten 1.000 Ergebnisse einer Abfrage beschränkt, 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

Indexabfragen

Durch die Indexierung Ihrer Daten wird die Gesamtbandbreite reduziert, die für jede von Ihrer Anwendung ausgeführte Abfrage verwendet wird.

SSL-Sitzungen wiederverwenden

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

Effizienz des Listeners verbessern

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

Fügen Sie Abfragen hinzu, um die Daten zu begrenzen, die von Ihren Abhörvorgängen zurückgegeben werden, und verwenden Sie Listener, die nur Aktualisierungen von Daten herunterladen, z. B. on() anstelle von once(). Reservieren Sie .once() für Aktionen, die wirklich keine Datenaktualisierungen erfordern. Sortieren Sie Ihre Abfragen außerdem 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 Datasets sehr langsam sein, da der gesamte Speicherort aus der Persistenzebene gelesen werden muss.

Fügen Sie Listener auch dynamisch hinzu und entfernen Sie sie, 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 sichern. Sie können gespeicherte Daten auch über Cloud Storage for Firebase hosten.

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

In IoT-Geräte integrierte Apps 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 gut, welche größeren Änderungen Sie später möglicherweise vornehmen müssen, wenn Sie sich beispielsweise für das Sharding Ihrer Daten entscheiden.