Ottimizza le prestazioni del database

Esistono diversi modi per migliorare le prestazioni del Firebase Realtime Database nella tua app. To find out what you can do to optimize your Realtime Database performance, gather data through the different Realtime Database monitoring tools, then make changes to your app or Realtime Database use accordingly.

Monitorare le prestazioni del database in tempo reale

Puoi raccogliere dati sulle prestazioni del tuo Realtime Database attraverso alcuni strumenti diversi, a seconda del livello di granularità di cui hai bisogno:

  • Panoramica di alto livello: utilizzare lo strumento profiler per un elenco di query non indicizzate e una panoramica in tempo reale delle operazioni di lettura/scrittura.
  • Stima dell'utilizzo fatturato: utilizza i parametri di utilizzo disponibili nella console Firebase per visualizzare l'utilizzo fatturato e i parametri delle prestazioni di alto livello.
  • Drilldown dettagliato: utilizza Cloud Monitoring per uno sguardo più granulare sulle prestazioni del tuo database nel tempo.

Migliora le prestazioni in base alla metrica

Dopo aver raccolto i dati, esplora le seguenti best practice e strategie in base all'area di rendimento che desideri migliorare.

Strategie di miglioramento delle prestazioni in sintesi
Metrico Descrizione Migliori pratiche
Carico/Utilizzo Ottimizza la quantità di capacità del tuo database utilizzata per elaborare le richieste in un dato momento (riflesso nelle metriche **Load** o **io/database_load**). Ottimizza la struttura dei tuoi dati
Suddividere i dati tra database
Migliora l'efficienza dell'ascoltatore
Limita i download con regole basate su query
Ottimizza le connessioni
Connessioni attive Balance the number of simultaneous, active connections to your database to stay under the 200,000-connection limit. Suddividere i dati tra database
Ridurre le nuove connessioni
Larghezza di banda in uscita Se i download dal tuo database sembrano più alti di quanto desideri, puoi migliorare l'efficienza delle tue operazioni di lettura e ridurre il sovraccarico di crittografia. Ottimizza le connessioni
Ottimizza la struttura dei tuoi dati
Limita i download con regole basate su query
Riutilizzare le sessioni SSL
Migliora l'efficienza dell'ascoltatore
Limitare l'accesso ai dati
Magazzinaggio Assicurati di non archiviare dati inutilizzati o di bilanciare i dati archiviati su altri database e/o prodotti Firebase per rimanere entro la quota. Pulisci i dati inutilizzati
Ottimizza la struttura dei tuoi dati
Suddividere i dati tra database
Utilizza Cloud Storage per Firebase

Ottimizza le connessioni

Le richieste RESTful come GET e PUT richiedono comunque una connessione, anche se tale connessione è di breve durata. These frequent, short-lived connections can actually add up to significantly more connection costs, database load, and outgoing bandwidth than realtime, active connections to your database.

Quando possibile, utilizza gli SDK nativi per la piattaforma della tua app anziché l'API REST. Gli SDK mantengono connessioni aperte, riducendo i costi di crittografia SSL e il carico del database che possono sommarsi con l'API REST.

If you do use the REST API, consider using an HTTP keep-alive to maintain an open connection or use server-sent events , which can reduce costs from SSL handshakes.

Suddividere i dati su più database

La suddivisione dei dati su più istanze di Realtime Database, altrimenti nota come sharding del database, offre tre vantaggi:

  1. Aumenta il numero totale di connessioni attive simultanee consentite sulla tua app suddividendole tra istanze di database.
  2. Bilanciare il carico tra le istanze del database.
  3. If you have independent groups of users that only need access to discrete data sets, use different database instances for higher throughput and lower latency.

If you're on the Blaze pricing plan , you can create multiple database instances within the same Firebase project, leveraging a common user authentication method across database instances.

Ulteriori informazioni su come e quando partizionare i dati .

Costruisci strutture dati efficienti

Because Realtime Database retrieves the data from a path's child nodes as well as the path, it makes sense to keep your data structure as flat as possible. In questo modo puoi recuperare selettivamente i dati di cui hai bisogno, senza scaricare sui client anche dati non necessari.

In particolare, considera le operazioni di scrittura ed eliminazione quando stai strutturando i tuoi dati. Ad esempio, l'eliminazione di percorsi con migliaia di foglie è potenzialmente costosa. Suddividerli in percorsi con più sottoalberi e meno foglie per nodo può accelerare le eliminazioni.

Inoltre, ogni scrittura può richiedere lo 0,1% dell'utilizzo totale del database. Structure your data in a way that allows you to batch writes into a single operation as multi-path updates through either the update() methods in the SDKs or RESTful PATCH requests.

Per ottimizzare la struttura dei dati e migliorare le prestazioni, segui le best practice per le strutture dei dati .

Impedire l'accesso non autorizzato

Previeni operazioni non autorizzate sul tuo database con le regole di sicurezza del database in tempo reale. Ad esempio, l'utilizzo delle regole potrebbe evitare uno scenario in cui un utente malintenzionato scarica ripetutamente l'intero database.

Learn more about using Firebase Realtime Database Rules .

Utilizza regole basate su query per limitare i download

Le regole di sicurezza del database in tempo reale limitano l'accesso ai dati nel database, ma possono anche fungere da limiti sui dati restituiti tramite operazioni di lettura. When you use query-based rules, as defined by query. expressions like query.limitToFirst , queries only retrieve the data bounded by the rule.

For example, the following rule limits read access to only the first 1000 results of a query, as ordered by priority:

messages: {
  ".read": "query.orderByKey &&
            query.limitToFirst <= 1000"
}

// Example query:
db.ref("messages").limitToFirst(1000)
                  .orderByKey("value")

Learn more about Realtime Database Security Rules .

Query sull'indice

Indexing your data reduces the total bandwidth you use for each query your app runs.

Riutilizzare le sessioni SSL

Reduce SSL encryption overhead costs on resumed connections by issuing TLS session tickets . This is particularly helpful if you do require frequent, secure connections to the database.

Migliora l'efficienza dell'ascoltatore

Place your listeners as far down the path as you can to limit the amount of data they sync. Your listeners should be close to the data you want them to get. Don't listen at the database root, as that results in downloads of your entire database.

Aggiungi query per limitare i dati restituiti dalle operazioni di ascolto e utilizza listener che scaricano solo aggiornamenti ai dati, ad esempio on() anziché once() . Reserve .once() for actions that truly don't require data updates. Additionally, sort your queries using orderByKey() , whenever possible, for the best performance. L'ordinamento con orderByChild() può essere 6-8 volte più lento e l'ordinamento con orderByValue() può essere molto lento per set di dati di grandi dimensioni, poiché richiede la lettura dell'intera posizione dal livello di persistenza.

Make sure to also add listeners dynamically, and remove them when they're no longer necessary.

Pulisci i dati inutilizzati

Periodically remove any unused or duplicate data in your database. You can run backups to manually inspect your data or periodically back it up to a Google Cloud Storage bucket. Considera anche l'hosting dei dati archiviati tramite Cloud Storage for Firebase .

Spedisci codice scalabile che puoi aggiornare

Le app integrate nei dispositivi IoT dovrebbero includere codice scalabile che puoi aggiornare facilmente. Assicurati di testare accuratamente i casi d'uso, tenere conto degli scenari in cui potresti far crescere la tua base utenti in modo esponenziale e sviluppare la capacità di distribuire aggiornamenti al tuo codice. Considera attentamente le principali modifiche che potresti dover apportare in futuro, se, ad esempio, decidi di suddividere i tuoi dati.