Esistono diversi modi per migliorare il Firebase Realtime Database rendimento della tua app. Per scoprire cosa puoi fare per ottimizzare il tuo Realtime Database rendimento, raccogli i dati tramite i diversi strumenti di Realtime Database monitoraggio, quindi apporta le modifiche necessarie all'app o all'Realtime Database uso.
Monitorare il rendimento di Realtime Database
Puoi raccogliere dati sul rendimento di Realtime Database tramite diversi strumenti, a seconda del livello di granularità di cui hai bisogno:
- Panoramica generale: utilizza lo strumento di profilazione 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.
- Livello di analisi dettagliato:utilizza Cloud Monitoring per esaminare in modo più granulare il rendimento del database nel tempo.
Migliorare il rendimento in base alla metrica
Dopo aver raccolto i dati, consulta le seguenti best practice e strategie in base all'area di rendimento che vuoi migliorare.
Riepilogo delle strategie di miglioramento del rendimento | ||
---|---|---|
Metrica | Descrizione | Best practice |
Carico/utilizzo | Ottimizza la quantità di capacità del tuo database in uso elaborando le richieste in un determinato momento (riflesso nelle metriche **Load** o **io/database_load**). |
Ottimizza la struttura dei dati Esegui lo sharding dei dati nei database Migliora l'efficienza degli ascoltatori 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 il partitioning dei dati in più database Riduci le nuove connessioni |
Larghezza di banda in uscita | Se i download dal tuo database sembrano superiori a quanto vorresti, puoi migliorare l'efficienza delle operazioni di lettura e ridurre il sovraccarico della crittografia. |
Ottimizza le connessioni Ottimizza la struttura dei dati Limita i download con regole basate su query Riutilizza le sessioni SSL Migliora l'efficienza degli ascoltatori Limita l'accesso ai dati |
Archiviazione | Assicurati di non archiviare dati inutilizzati o bilancia i dati archiviati su altri database e/o prodotti Firebase per rimanere al di sotto della quota. |
Pulisci i dati inutilizzati Ottimizza la struttura dei dati Esegui lo sharding dei dati nei database Utilizza Cloud Storage for Firebase |
Ottimizzare le connessioni
Le richieste RESTful come GET
e PUT
richiedono comunque una connessione, anche se
questa è di breve durata. Queste connessioni frequenti e di breve durata possono comportare costi di connessione, carico del database e larghezza di banda in uscita notevolmente superiori rispetto alle connessioni attive in tempo reale al database.
Se possibile, utilizza gli SDK nativi per la piattaforma della tua app anziché l'API REST. Gli SDK mantengono connessioni aperte, riducendo i costi della crittografia SSL e il carico del database che può sommarsi con l'API REST.
Se utilizzi l'API REST, ti consigliamo di utilizzare un keep-alive HTTP per mantenere aperta una connessione o di utilizzare gli eventi inviati dal server, che possono ridurre i costi delle handshake SSL.
Suddividi i dati in più database
La suddivisione dei dati in più istanze Realtime Database, nota anche come sharding del database, offre tre vantaggi:
- Aumenta il totale delle connessioni attive simultanee consentite sulla tua app suddividendole tra le istanze di database.
- Bilancia il carico tra le istanze del database.
- 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 utilizzi il piano tariffario Blaze, puoi creare più istanze di database nello stesso progetto Firebase, sfruttando un metodo di autenticazione utente comune in tutte 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, 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 i dati non necessari per i clienti.
In particolare, prendi in considerazione le scritture e le eliminazioni quando strutturi i dati. Ad esempio, i percorsi con migliaia di elementi sono potenzialmente costosi da eliminare. Se li dividi in percorsi con più sottoalberi e meno foglie per nodo, puoi velocizzare le eliminazioni.
Inoltre, ogni scrittura può occupare lo 0,1% dell'utilizzo totale del database.
Struttura i dati in modo da poter eseguire le scritture in batch in un'unica operazione sotto forma di aggiornamenti a percorsi multipli tramite i metodi update()
negli SDK o nelle richieste RESTful PATCH
.
Per ottimizzare la struttura dei dati e migliorare le prestazioni, segui le best practice per le strutture di dati.
Impedire l'accesso non autorizzato
Impedisci le 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 scarichi 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 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 indice
L'indicizzazione dei dati riduce la larghezza di banda totale utilizzata per ogni query eseguita dall'app.
Riutilizzare 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.
Migliorare l'efficienza degli ascoltatori
Posiziona i listener il più lontano possibile nel percorso per limitare la quantità di dati da sincronizzare. Gli ascoltatori devono trovarsi nelle vicinanze dei dati che vuoi che acquisiscano. Non eseguire l'ascolto nella directory principale del database, in quanto ciò comporterà i download dell'intero database.
Aggiungi query per limitare i dati restituiti dalle operazioni di ascolto e utilizza ascoltatori che scaricano solo gli aggiornamenti dei dati, ad esempio on()
anziché
once()
. Riserva .once()
per azioni che non richiedono effettivamente 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 la lettura dell'intera posizione dal livello di persistenza.
Assicurati di aggiungere anche gli ascoltatori in modo dinamico e di rimuoverli quando non sono più necessari.
Eliminare i dati inutilizzati
Rimuovi periodicamente i dati inutilizzati o duplicati dal database. Puoi eseguire backup per ispezionare manualmente i dati o eseguire periodicamente il backup in un bucket Google Cloud Storage. Inoltre, prendi in considerazione l'hosting dei dati archiviati tramite Cloud Storage for Firebase.
Fornisci 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, prendi in considerazione scenari in cui potresti far crescere la tua base utenti in modo esponenziale e integra la possibilità di implementare aggiornamenti al codice. Valuta attentamente le modifiche sostanziali che potresti dover apportare in futuro, ad esempio se decidi di eseguire lo sharding dei dati.