Esistono diversi modi per migliorare il Firebase Realtime Database rendimento della tua app. Per scoprire cosa puoi fare per ottimizzare il 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 utilizzo.
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.
Panoramica delle strategie di miglioramento del rendimento | ||
---|---|---|
Metrica | Descrizione | Best practice |
Carico/Utilizzo | Ottimizza la quantità di capacità del database in uso per l'elaborazione delle richieste in un determinato momento (riflessa 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 database per non superare il 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 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 aperte le connessioni, riducendo i costi della crittografia SSL e il carico del database che possono sommarsi con l'API REST.
Se utilizzi l'API REST, ti consigliamo di utilizzare un keep-alive HTTP per mantenere una connessione aperta 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 frammentazione del database, offre tre vantaggi:
- Aumenta il numero totale di connessioni attive simultanee consentite nella tua app dividendole 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 client.
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 raggruppare le scritture in un'unica operazione come aggiornamenti multipath tramite i metodi update()
negli SDK o le richieste PATCH
RESTful.
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 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 di 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 gli ascoltatori il più lontano possibile nel percorso per limitare la quantità di dati che sincronizzano. 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à il 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 le azioni che non richiedono aggiornamenti dei dati.
Inoltre, ordina le query utilizzando orderByKey()
, se possibile, per ottenere il miglior rendimento. 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 nel 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.
Pubblica 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.