Optimieren Sie die Datenbankleistung

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:

  1. Erhöhen Sie die Gesamtzahl gleichzeitiger, aktiver Verbindungen, die für Ihre App zulässig sind, indem Sie sie auf Datenbankinstanzen aufteilen.
  2. Verteilen Sie die Last auf alle Datenbankinstanzen.
  3. 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.