Es gibt verschiedene Möglichkeiten, die Firebase Realtime Database-Leistung in Ihrer App zu verbessern. Um herauszufinden, was Sie tun können, um die Leistung Ihrer Realtime Database zu optimieren, erheben Sie Daten mit den verschiedenen Realtime Database-Monitoring-Tools und nehmen Sie dann entsprechende Änderungen an Ihrer App oder Realtime Database vor.
Leistung von Realtime Database überwachen
Je nach gewünschtem Detaillierungsgrad können Sie die Leistung Ihrer Realtime Database mit verschiedenen Tools analysieren:
- Übersicht:Mit dem Profiler-Tool erhalten Sie eine Liste der nicht indexierten Abfragen und eine Echtzeitübersicht über Lese-/Schreibvorgänge.
- Geschätzte abgerechnete Nutzung:Anhand der Nutzungsmesswerte in der Firebase-Konsole können Sie Ihre abgerechnete Nutzung und allgemeine Leistungsmesswerte einsehen.
- Detaillierter Drilldown: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 sich die folgenden Best Practices und Strategien ansehen, die auf dem Leistungsbereich basieren, den Sie verbessern möchten.
Strategien zur Leistungssteigerung im Überblick | ||
---|---|---|
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 (dargestellt in den Messwerten **Load** oder **io/database_load**). |
Datenstruktur optimieren Daten auf mehrere Datenbanken aufteilen Effizienz von Listenern verbessern Downloads mit abfragebasierten Regeln einschränken Verbindungen optimieren |
Aktive Verbindungen | Sorgen Sie dafür, dass die Anzahl der gleichzeitigen,aktiven Verbindungen zu Ihrer Datenbank unter dem Limit von 200.000 Verbindungen bleibt. |
Daten auf mehrere Datenbanken aufteilen Anzahl neuer 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üsselungsaufwand reduzieren. |
Verbindungen optimieren Datenstruktur optimieren Downloads mit abfragebasierten Regeln einschränken 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. |
Nicht verwendete Daten bereinigen Datenstruktur optimieren Daten auf mehrere Datenbanken aufteilen Cloud Storage for Firebase verwenden |
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 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, wodurch die Kosten für die SSL-Verschlüsselung und die Datenbanklast reduziert werden, die sich bei der REST API summieren können.
Wenn Sie die REST API verwenden, sollten Sie eine HTTP-Keep-Alive-Verbindung nutzen, um eine offene Verbindung aufrechtzuerhalten, oder servergesendete Ereignisse verwenden, um die Kosten für SSL-Handshakes zu senken.
Daten auf mehrere Datenbanken aufteilen
Wenn Sie Ihre Daten auf mehrere Realtime Database-Instanzen aufteilen (auch als Datenbank-Sharding bezeichnet), ergeben sich drei Vorteile:
- Sie können die Gesamtzahl der gleichzeitigen aktiven Verbindungen, die in Ihrer App zulässig sind, erhöhen, indem Sie sie auf Datenbankinstanzen aufteilen.
- Last auf Datenbankinstanzen verteilen
- 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 den Blaze-Tarif nutzen, können Sie mehrere Datenbankinstanzen im selben Firebase-Projekt erstellen und dabei eine gemeinsame Methode zur Nutzerauthentifizierung für alle Datenbankinstanzen verwenden.
Weitere Informationen zum Sharding von Daten
Effiziente Datenstrukturen erstellen
Da mit Realtime Database die Daten von den untergeordneten Knoten eines Pfads sowie vom Pfad selbst abgerufen werden, 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 insbesondere Schreib- und Löschvorgänge, wenn Sie Ihre Daten strukturieren. Das Löschen von Pfaden mit Tausenden von Blättern kann beispielsweise teuer sein. 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% Ihrer gesamten Datenbanknutzung in Anspruch nehmen.
Strukturieren Sie Ihre Daten so, dass Sie Schreibvorgänge in einem einzigen Vorgang als Updates mit mehreren Pfaden ü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, sollten Sie die Best Practices für Datenstrukturen befolgen.
Unbefugten Zugriff verhindern
Verhindern Sie unbefugte Vorgänge in Ihrer Datenbank mit Realtime Database Security Rules. Mit Regeln lässt sich 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 einschränken
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 durch Lesevorgänge zurückgegeben werden. Wenn Sie abfragebasierte Regeln verwenden, die durch query.
-Ausdrücke wie query.limitToFirst
definiert werden, werden mit Abfragen nur die Daten abgerufen, die durch die Regel begrenzt werden.
Die folgende Regel beschränkt beispielsweise den Lesezugriff 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
Index Suchanfragen
Durch Indexieren Ihrer Daten wird die insgesamt für jede Abfrage Ihrer App verwendete Bandbreite reduziert.
SSL-Sitzungen wiederverwenden
Reduzieren Sie den SSL-Verschlüsselungs-Overhead bei fortgesetzten Verbindungen, indem Sie TLS-Sitzungstickets ausstellen. Das ist besonders hilfreich, wenn Sie häufig sichere Verbindungen zur Datenbank benötigen.
Effizienz der Zuhörer verbessern
Platzieren Sie Ihre Listener so weit unten im Pfad wie möglich, um die Menge der synchronisierten Daten zu begrenzen. Die Zuhörer sollten sich in der Nähe der Daten befinden, die sie erhalten sollen. Hören Sie nicht auf die Datenbank-Root, da dies zum Herunterladen der gesamten Datenbank führt.
Fügen Sie Abfragen hinzu, um die Daten zu begrenzen, die von Ihren Listen-Vorgängen zurückgegeben werden, und verwenden Sie Listener, die nur Updates für Daten herunterladen, z. B. on()
anstelle von once()
. Reservieren Sie .once()
für Aktionen, die wirklich keine Datenaktualisierungen erfordern.
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 Datasets sehr langsam sein, da die gesamte Position aus der Persistenzebene gelesen werden muss.
Fügen Sie Listener dynamisch hinzu und entfernen Sie sie, wenn sie nicht mehr benötigt werden.
Nicht verwendete Daten bereinigen
Entfernen Sie regelmäßig alle ungenutzten oder doppelten Daten in 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 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 sorgen Sie dafür, dass Sie Updates für Ihren Code bereitstellen können. Überlegen Sie sich genau, welche größeren Änderungen Sie möglicherweise vornehmen müssen, wenn Sie sich beispielsweise entscheiden, Ihre Daten zu sharden.