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:
- Erhöhen Sie die Gesamtzahl der simultanen, aktiven Verbindungen, die in Ihrer Anwendung zulässig sind, indem Sie sie auf Datenbankinstanzen aufteilen.
- Last auf Datenbankinstanzen verteilen
- 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.