Ottimizza le prestazioni del database

Esistono diversi modi per migliorare le prestazioni di Firebase Realtime Database nella tua app. Per scoprire cosa puoi fare per ottimizzare le prestazioni di Realtime Database, raccogli i dati tramite i diversi strumenti di monitoraggio di Realtime Database, quindi apporta le modifiche alla tua app o all'utilizzo di Realtime Database di conseguenza.

Monitora le prestazioni di Realtime Database

Puoi raccogliere dati sul rendimento di Realtime Database tramite alcuni strumenti diversi, a seconda del livello di granularità di cui hai bisogno:

  • Panoramica generale: utilizza 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 le metriche di utilizzo disponibili nella consoleFirebase per visualizzare l'utilizzo fatturato e le metriche sul rendimento di alto livello.
  • Analisi dettagliata: utilizza Cloud Monitoring per un'analisi più granulare del rendimento del database nel tempo.

Migliora il rendimento in base alla metrica

Una volta raccolti i dati, esplora le seguenti best practice e strategie in base all'area di rendimento che vuoi migliorare.

Strategie di miglioramento del rendimento in sintesi
Metrica Descrizione Best practice
Carico/utilizzo Ottimizza la quantità di capacità del database utilizzata per l'elaborazione delle richieste in un determinato momento (riflessa nelle metriche **Carico** o **io/database_load**). Ottimizza la struttura dei dati
Suddividi i dati tra i database
Migliora l'efficienza dei listener
Limita i download con regole basate su query
Ottimizza le connessioni
Connessioni attive Bilancia il numero di connessioni attive simultanee al tuo database per rimanere al di sotto del limite di 200.000 connessioni. Esegui lo sharding dei dati tra i database
Riduci le nuove connessioni
Larghezza di banda in uscita Se i download dal tuo database sembrano superiori a quelli che vorresti, puoi migliorare l'efficienza delle operazioni di lettura e ridurre l'overhead di crittografia. Ottimizza le connessioni
Ottimizza la struttura dei dati
Limita i download con regole basate su query
Riutilizza le sessioni SSL
Migliora l'efficienza dei listener
Limita l'accesso ai dati
Archiviazione Assicurati di non archiviare dati inutilizzati o di bilanciare i dati archiviati in altri database e/o prodotti Firebase per non superare la quota. Pulisci i dati inutilizzati
Ottimizza la struttura dei dati
Esegui lo sharding dei dati tra i database
Utilizza Cloud Storage for Firebase

Ottimizza le connessioni

Le richieste RESTful come GET e PUT richiedono comunque una connessione, anche se di breve durata. Queste connessioni frequenti e di breve durata possono effettivamente comportare costi di connessione, carico del database e larghezza di banda in uscita significativamente maggiori rispetto alle connessioni attive in tempo reale al database.

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

Se utilizzi l'API REST, valuta la possibilità di utilizzare un keep-alive HTTP per mantenere una connessione aperta o di utilizzare gli eventi inviati dal server, che possono ridurre i costi degli handshake SSL.

Suddividi i dati in più database

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

  1. Aumenta il numero totale di connessioni attive simultanee consentite sulla tua app suddividendole tra le istanze di database.
  2. Bilancia il carico tra le istanze di database.
  3. Se hai gruppi di utenti indipendenti che devono accedere solo a set di dati discreti, utilizza istanze di database diverse per un throughput più elevato e una latenza inferiore.

Se hai scelto il piano tariffario Blaze, puoi creare più istanze di database all'interno dello stesso progetto Firebase, sfruttando un metodo di autenticazione utente comune tra le istanze di database.

Scopri di più su come e quando eseguire lo sharding dei dati.

Crea strutture di dati efficienti

Poiché Realtime Database recupera i dati dai nodi secondari di un percorso, oltre che dal percorso, è opportuno mantenere la struttura dei dati il più piatta possibile. In questo modo, puoi recuperare in modo selettivo i dati di cui hai bisogno, senza scaricare anche dati non necessari sui client.

In particolare, tieni conto delle operazioni di scrittura ed eliminazione quando strutturi i dati. Ad esempio, i percorsi con migliaia di foglie sono potenzialmente costosi da eliminare. La suddivisione in percorsi con più sottoalberi e meno foglie per nodo può velocizzare le eliminazioni.

Inoltre, ogni scrittura può occupare lo 0,1% dell'utilizzo totale del database. Struttura i dati in modo da poter raggruppare le scritture in un'unica operazione come aggiornamenti multi-percorso tramite i metodi update() negli SDK o le richieste RESTful PATCH.

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

Impedisci l'accesso non autorizzato

Impedisci operazioni non autorizzate sul tuo database con Realtime Database Security Rules. Ad esempio, l'utilizzo delle regole potrebbe evitare uno scenario in cui un utente malintenzionato scarica ripetutamente l'intero database.

Scopri di più sull'utilizzo delle regole di Firebase Realtime Database.

Utilizza regole basate su query per limitare i download

Le Realtime Database Security Rules limitano l'accesso ai dati nel database, ma possono anche fungere da limiti per i dati restituiti tramite operazioni di lettura. Quando utilizzi regole basate su query, definite da espressioni query. come query.limitToFirst, le query recuperano solo i dati limitati dalla regola.

Ad esempio, la seguente regola limita l'accesso in lettura solo ai primi 1000 risultati di una query, ordinati per priorità:

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

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

Scopri di più su Realtime Database Security Rules.

Query di indice

L'indicizzazione dei dati riduce la larghezza di banda totale utilizzata per ogni query eseguita dall'app.

Riutilizza le sessioni SSL

Riduci i costi di overhead della crittografia SSL sulle connessioni riprese emettendo ticket di sessione TLS. Questo è particolarmente utile se hai bisogno di connessioni frequenti e sicure al database.

Migliora l'efficienza del listener

Posiziona i listener il più in basso possibile nel percorso per limitare la quantità di dati che sincronizzano. I listener devono essere vicini ai dati che vuoi che ricevano. Non ascoltare la radice del database, poiché ciò comporta il download dell'intero database.

Aggiungi query per limitare i dati restituiti dalle operazioni di ascolto e utilizza listener che scaricano solo gli aggiornamenti dei dati, ad esempio on() anziché once(). Riserva .once() per le azioni che non richiedono aggiornamenti dei dati. Inoltre, ordina le query utilizzando orderByKey(), se possibile, per ottenere il rendimento migliore. L'ordinamento con orderByChild() può essere 6-8 volte più lento, mentre 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.

Assicurati di aggiungere i listener anche in modo dinamico e di rimuoverli quando non sono più necessari.

Elimina i dati non utilizzati

Rimuovi periodicamente i dati non utilizzati o duplicati nel database. Puoi eseguire backup per ispezionare manualmente i dati o eseguirne periodicamente il backup in un bucket Google Cloud Storage. Valuta anche la possibilità di ospitare i dati archiviati tramite Cloud Storage for Firebase.

Invia codice scalabile che puoi aggiornare

Le app integrate nei dispositivi IoT devono includere un codice scalabile che puoi aggiornare facilmente. Assicurati di testare accuratamente i casi d'uso, di tenere conto degli scenari in cui la tua base utenti potrebbe crescere in modo esponenziale e di integrare la possibilità di eseguire il deployment degli aggiornamenti nel tuo codice. Valuta attentamente le modifiche principali che potresti dover apportare in futuro, ad esempio se decidi di eseguire lo sharding dei dati.