Ottimizza le prestazioni del database

Esistono diversi modi per migliorare il rendimento Firebase Realtime Database della tua app. Per scoprire cosa puoi fare per ottimizzare il rendimento Realtime Database, raccogli i dati tramite i diversi strumenti di monitoraggio Realtime Database, poi apporta le modifiche necessarie all'app o all'utilizzo Realtime Database.

Monitorare il rendimento di Realtime Database

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

  • Panoramica di alto livello: 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 console Firebase per visualizzare l'utilizzo fatturato e le metriche di rendimento di alto livello.
  • Visualizzazione in dettaglio:utilizza Cloud Monitoring per un'analisi più granulare del rendimento del database nel tempo.

Migliorare il rendimento per 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 a colpo d'occhio
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
Distribuisci 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 simultanee attive al tuo database per rimanere al di sotto del limite di 200.000 connessioni. Suddividi i dati in più database
Ridurre le nuove connessioni
Larghezza di banda in uscita Se i download dal database ti sembrano superiori a quanto desideri, puoi migliorare l'efficienza delle operazioni di lettura e ridurre il sovraccarico di crittografia. Ottimizzare le connessioni
Ottimizzare la struttura dei dati
Limitare i download con regole basate sulle query
Riutilizzare le sessioni SSL
Migliorare l'efficienza del listener
Limitare l'accesso ai dati
Archiviazione Assicurati di non archiviare dati inutilizzati o bilancia i dati archiviati in altri database e/o prodotti Firebase per rimanere al di sotto della quota. Pulire i dati inutilizzati
Ottimizzare la struttura dei dati
Distribuire i dati su più database
Utilizzare Cloud Storage for Firebase

Ottimizzare le connessioni

Le richieste RESTful come GET e PUT richiedono comunque una connessione, anche se questa connessione è 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 superiori 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 aumentare con l'API REST.

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

Suddividere i dati in più database

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

  1. Aumenta il numero totale di connessioni simultanee attive consentite nella tua app distribuendole tra le istanze del database.
  2. Bilancia il carico tra le istanze del database.
  3. Se hai gruppi indipendenti di utenti che hanno bisogno solo dell'accesso a set di dati discreti, utilizza istanze di database diverse per una velocità effettiva maggiore e una latenza inferiore.

Se hai 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 partizionare i dati.

Creare strutture di dati efficienti

Poiché Realtime Database recupera i dati dai nodi secondari di un percorso, nonché dal percorso stesso, è consigliabile 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, considera le 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ò accelerare 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 una singola operazione come aggiornamenti multi-path tramite i metodi update() negli SDK o le richieste RESTful PATCH.

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

Prevenire 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.

Utilizzare regole basate su query per limitare i download

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

Ad esempio, la seguente regola limita l'accesso in lettura solo ai primi 1000 risultati di una query, in base all'ordine di 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.

Riutilizzare le sessioni SSL

Ridurre i costi generali della crittografia SSL sulle connessioni riprese emettendo ticket di sessione TLS. Ciò è particolarmente utile se hai bisogno di connessioni frequenti e sicure al database.

Migliorare l'efficienza degli ascoltatori

Posiziona i listener il più in basso possibile nel percorso per limitare la quantità di dati che sincronizzano. Gli ascoltatori devono trovarsi in prossimità dei dati che vuoi che ricevano. Non ascoltare la radice del database, in quanto 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 e l'ordinamento con orderByValue() può essere molto lento per set di dati di grandi dimensioni, poiché richiede una lettura dell'intera posizione dal livello di persistenza.

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

Pulire i dati inutilizzati

Rimuovi periodicamente i dati inutilizzati o duplicati nel database. Puoi eseguire backup per esaminare manualmente i dati o eseguirne periodicamente il backup in un bucket Google Cloud Storage. Inoltre, valuta l'hosting dei dati archiviati tramite Cloud Storage for Firebase.

Spedisci codice scalabile che puoi aggiornare

Le app integrate nei dispositivi IoT devono includere codice scalabile che puoi aggiornare facilmente. Assicurati di testare a fondo i casi d'uso, di tenere conto degli scenari in cui potresti aumentare la tua base di utenti in modo esponenziale e di integrare la possibilità di implementare gli aggiornamenti del codice. Valuta attentamente le modifiche importanti che potresti dover apportare in futuro, ad esempio se decidi di partizionare i dati.