Es gibt verschiedene Möglichkeiten, die Leistung der Firebase-Echtzeitdatenbank in Ihrer App zu verbessern. Um herauszufinden, was Sie tun können, um die Leistung Ihrer Echtzeitdatenbank zu optimieren, sammeln Sie Daten mit den verschiedenen Echtzeitdatenbank-Überwachungstools und nehmen Sie dann entsprechende Änderungen an Ihrer App oder Echtzeitdatenbanknutzung vor.
Überwachen Sie die Leistung der Echtzeitdatenbank
Sie können Daten über die Leistung Ihrer Echtzeitdatenbank mithilfe einiger verschiedener Tools sammeln, je nachdem, welche Granularitätsstufe Sie benötigen:
- Allgemeiner Überblick: Verwenden Sie das Profiler-Tool für eine Liste nicht indizierter Abfragen und einen Echtzeitüberblick über Lese-/Schreibvorgänge.
- Schätzung der abgerechneten Nutzung: Verwenden Sie die in der Firebase-Konsole verfügbaren Nutzungsmetriken , um Ihre abgerechnete Nutzung und allgemeine Leistungsmetriken anzuzeigen.
- Detaillierter Drilldown: Verwenden Sie Cloud Monitoring für einen detaillierteren Blick auf die Leistung Ihrer Datenbank im Laufe der Zeit.
Verbessern Sie die Leistung anhand von Metriken
Nachdem Sie die Daten gesammelt haben, erkunden Sie die folgenden Best Practices und Strategien basierend auf dem Leistungsbereich, den Sie verbessern möchten.
Strategien zur Leistungsverbesserung auf einen Blick | ||
---|---|---|
Metrisch | Beschreibung | Empfohlene Vorgehensweise |
Auslastung/Auslastung | Optimieren Sie, wie viel von der Kapazität Ihrer Datenbank zu einem bestimmten Zeitpunkt für die Verarbeitung von Anforderungen verwendet wird (spiegelt sich in den Metriken **Load** oder **io/database_load** wider). | Optimieren Sie Ihre Datenstruktur Teilen Sie Daten datenbankübergreifend auf Verbessern Sie die Hörereffizienz Begrenzen Sie Downloads mit abfragebasierten Regeln Verbindungen optimieren |
Aktive Verbindungen | Passen Sie die Anzahl gleichzeitiger, aktiver Verbindungen zu Ihrer Datenbank an, um unter der Grenze von 200.000 Verbindungen zu bleiben. | Teilen Sie Daten datenbankübergreifend auf Reduzieren Sie neue Verbindungen |
Ausgehende Bandbreite | Wenn die Downloads aus Ihrer Datenbank höher erscheinen, als Sie möchten, können Sie die Effizienz Ihrer Lesevorgänge verbessern und den Verschlüsselungsaufwand reduzieren. | Verbindungen optimieren Optimieren Sie Ihre Datenstruktur Begrenzen Sie Downloads mit abfragebasierten Regeln SSL-Sitzungen wiederverwenden Verbessern Sie die Hörereffizienz Beschränken Sie den Zugriff auf Daten |
Lagerung | Stellen Sie sicher, dass Sie keine ungenutzten Daten speichern, oder verteilen Sie Ihre gespeicherten Daten auf andere Datenbanken und/oder Firebase-Produkte, um unter dem Kontingent zu bleiben. | Bereinigen Sie nicht verwendete Daten Optimieren Sie Ihre Datenstruktur Teilen Sie Daten datenbankübergreifend auf Verwenden Sie Cloud Storage für Firebase |
Verbindungen optimieren
RESTful-Anfragen wie GET
und PUT
erfordern weiterhin eine Verbindung, auch wenn diese nur von kurzer Dauer ist. Diese häufigen, kurzlebigen Verbindungen können tatsächlich zu erheblich 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 und reduzieren so die SSL-Verschlüsselungskosten und die Datenbanklast, die sich mit der REST-API summieren können.
Wenn Sie die REST-API verwenden, sollten Sie die Verwendung eines HTTP-Keep-Alive in Betracht ziehen, um eine offene Verbindung aufrechtzuerhalten, oder vom Server gesendete Ereignisse verwenden, was die Kosten durch SSL-Handshakes senken kann.
Shard-Daten über mehrere Datenbanken hinweg
Die Aufteilung Ihrer Daten auf mehrere Echtzeitdatenbankinstanzen, auch Datenbank-Sharding genannt, bietet drei Vorteile:
- Erhöhen Sie die Gesamtzahl gleichzeitiger, aktiver Verbindungen, die für Ihre App zulässig sind, indem Sie sie auf Datenbankinstanzen aufteilen.
- Verteilen Sie die Last auf alle Datenbankinstanzen.
- Wenn Sie unabhängige Benutzergruppen haben, die nur Zugriff auf einzelne Datensätze benötigen, verwenden Sie unterschiedliche Datenbankinstanzen für einen höheren Durchsatz und eine geringere Latenz.
Wenn Sie den Blaze-Preisplan nutzen, können Sie mehrere Datenbankinstanzen innerhalb desselben Firebase-Projekts erstellen und dabei eine gemeinsame Benutzerauthentifizierungsmethode für alle Datenbankinstanzen nutzen.
Erfahren Sie mehr darüber, wie und wann Daten geshardt werden.
Erstellen Sie effiziente Datenstrukturen
Da die Echtzeitdatenbank die Daten sowohl von den untergeordneten Knoten eines Pfads als auch vom Pfad abruft, ist es sinnvoll, Ihre Datenstruktur so flach wie möglich zu halten. Auf diese Weise können Sie gezielt die benötigten Daten abrufen, ohne unnötige Daten auch auf Clients herunterzuladen.
Berücksichtigen Sie bei der Strukturierung Ihrer Daten insbesondere Schreib- und Löschvorgänge. Das Löschen von Pfaden mit Tausenden von Blättern kann beispielsweise kostspielig sein. Durch die Aufteilung in Pfade mit mehreren Teilbäumen und weniger Blättern pro Knoten kann das Löschen beschleunigt werden.
Darüber hinaus kann jeder Schreibvorgang 0,1 % Ihrer gesamten Datenbankauslastung in Anspruch nehmen. Strukturieren Sie Ihre Daten so, dass Sie Batch-Schreibvorgänge in einem einzigen Vorgang als Multi-Path-Updates entweder über die update()
Methoden in den SDKs oder über RESTful PATCH
Anfragen durchführen können.
Befolgen Sie die Best Practices für Datenstrukturen , um Ihre Datenstruktur zu optimieren und die Leistung zu verbessern.
Verhindern Sie unbefugten Zugriff
Verhindern Sie unbefugte Vorgänge in Ihrer Datenbank mit Echtzeit-Datenbanksicherheitsregeln. Durch die Verwendung von Regeln könnte beispielsweise ein Szenario vermieden werden, in dem ein böswilliger Benutzer wiederholt Ihre gesamte Datenbank herunterlädt.
Erfahren Sie mehr über die Verwendung von Firebase-Echtzeitdatenbankregeln .
Verwenden Sie abfragebasierte Regeln, um Downloads einzuschränken
Echtzeit-Datenbanksicherheitsregeln schränken den Zugriff auf Daten in Ihrer Datenbank ein, können aber auch als Beschränkungen für Daten dienen, die durch Lesevorgänge zurückgegeben werden. Wenn Sie abfragebasierte Regeln verwenden, wie durch query.
Mit Ausdrücken wie query.limitToFirst
rufen Abfragen nur die durch die Regel begrenzten Daten ab.
Die folgende Regel beschränkt beispielsweise den Lesezugriff nur auf die ersten 1000 Ergebnisse einer Abfrage, geordnet nach Priorität:
messages: {
".read": "query.orderByKey &&
query.limitToFirst <= 1000"
}
// Example query:
db.ref("messages").limitToFirst(1000)
.orderByKey("value")
Erfahren Sie mehr über Echtzeit-Datenbanksicherheitsregeln .
Indexabfragen
Durch die Indizierung Ihrer Daten wird die Gesamtbandbreite reduziert, die Sie für jede von Ihrer App ausgeführte Abfrage verwenden.
SSL-Sitzungen wiederverwenden
Reduzieren Sie die Overhead-Kosten für die SSL-Verschlüsselung bei wiederaufgenommenen Verbindungen durch die Ausstellung von TLS-Sitzungstickets . Dies ist besonders hilfreich, wenn Sie häufige, sichere Verbindungen zur Datenbank benötigen.
Verbessern Sie die Hörereffizienz
Platzieren Sie Ihre Zuhörer so weit wie möglich im Pfad, um die Datenmenge zu begrenzen, die sie synchronisieren. Ihre Zuhörer sollten nah an den Daten sein, die Sie ihnen vermitteln möchten. Hören Sie nicht auf das Stammverzeichnis der Datenbank, da dies zum Herunterladen Ihrer gesamten Datenbank führt.
Fügen Sie Abfragen hinzu, um die Daten zu begrenzen, die Ihre Listen-Vorgänge zurückgeben, und verwenden Sie Listener, die nur Datenaktualisierungen herunterladen – zum Beispiel on()
anstelle von once()
. Reservieren Sie .once()
für Aktionen, die wirklich keine Datenaktualisierungen erfordern. Sortieren Sie Ihre Abfragen außerdem wann immer möglich mit orderByKey()
, um die beste Leistung zu erzielen. Das Sortieren mit orderByChild()
kann 6–8 Mal langsamer sein, und das Sortieren mit orderByValue()
kann bei großen Datensätzen sehr langsam sein, da es ein Lesen des gesamten Speicherorts aus der Persistenzschicht erfordert.
Stellen Sie sicher, dass Sie Listener auch dynamisch hinzufügen und entfernen Sie sie, wenn sie nicht mehr benötigt werden.
Bereinigen Sie nicht verwendete Daten
Entfernen Sie regelmäßig alle nicht verwendeten oder doppelten Daten aus Ihrer Datenbank. Sie können Sicherungen durchführen, um Ihre Daten manuell zu überprüfen, oder sie regelmäßig in einem Google Cloud Storage-Bucket sichern. Ziehen Sie auch in Betracht, gespeicherte Daten über Cloud Storage für Firebase zu hosten.
Versenden Sie skalierbaren Code, den Sie aktualisieren können
In IoT-Geräte integrierte Apps sollten skalierbaren Code enthalten, der sich problemlos aktualisieren lässt. Stellen Sie sicher, dass Sie Anwendungsfälle gründlich testen, Szenarien berücksichtigen, in denen Sie Ihre Benutzerbasis exponentiell vergrößern könnten, und die Möglichkeit einbauen, Updates für Ihren Code bereitzustellen. Überlegen Sie sorgfältig, welche größeren Änderungen später möglicherweise vorgenommen werden müssen, wenn Sie sich beispielsweise dazu entschließen, Ihre Daten zu teilen.