Esistono diversi modi per migliorare le Firebase Realtime Database prestazioni nella tua app. Per scoprire cosa puoi fare per ottimizzare le tue Realtime Database prestazioni, raccogli i dati tramite i diversi strumenti di Realtime Database monitoraggio, quindi apporta le modifiche necessarie all'app o all'utilizzo Realtime Database di conseguenza.
Monitorare il rendimento di Realtime Database
Puoi raccogliere dati sul rendimento di Realtime Database's tramite alcuni strumenti diversi, a seconda del livello di granularità di cui hai bisogno:
- Panoramica di alto livello: 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 Firebase console 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.
Migliorare 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 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 (indicata nelle metriche **Carico** o **io/database_load**). |
Ottimizzare la struttura dei dati Partizionare i dati tra i database Migliorare l'efficienza dei listener Limitare i download con regole basate su query Ottimizzare 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. |
Partizionare i dati tra i database Ridurre le nuove connessioni |
| Larghezza di banda in uscita | Se i download dal database sembrano superiori a quelli desiderati, 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 su query Riutilizzare le sessioni SSL Migliorare l'efficienza dei listener Limitare l'accesso ai dati |
| Archiviazione | Assicurati di non archiviare dati non utilizzati o di bilanciare i dati archiviati tra altri database e/o prodotti Firebase per rimanere entro la quota. |
Liberare spazio dai dati non utilizzati Ottimizzare la struttura dei dati Partizionare i dati tra i database Utilizzare 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 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 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 utilizzare gli eventi inviati dal server, che possono ridurre i costi degli handshake SSL.
Partizionare i dati tra più database
La suddivisione dei dati tra più istanze Realtime Database, nota anche come partizionamento del database, offre tre vantaggi:
- Aumenta il numero totale di connessioni attive simultanee consentite nella tua app dividendole tra le istanze del 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 una maggiore velocità effettiva 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 del 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 e da l 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 scritture e le eliminazioni 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 una singola operazione come aggiornamenti multi-percorso tramite i metodi update() negli SDK o le richieste PATCH RESTful.
Per ottimizzare la struttura dei dati e migliorare il rendimento, segui le best practice per le strutture di dati.
Impedire l'accesso non autorizzato
Impedisci le operazioni non autorizzate sul 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
Riduci i costi di sovraccarico della crittografia SSL sulle connessioni riprese emettendo i ticket di sessione TLS. Questo è particolarmente utile se hai bisogno di connessioni sicure e frequenti al database.
Migliorare l'efficienza dei listener
Posiziona i listener il più in basso possibile nel percorso per limitare la quantità di dati sincronizzati. I listener devono essere vicini ai dati che vuoi che recuperino. Non ascoltare la radice del database, perché in questo modo vengono scaricati tutti i dati del database.
Aggiungi query per limitare i dati restituiti dalle operazioni di ascolto e utilizza
i 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(), quando 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 i set di dati di grandi dimensioni, poiché richiede una lettura dell'intera località dal livello di persistenza.
Assicurati di aggiungere anche i listener in modo dinamico e di rimuoverli quando non sono più necessari.
Liberare spazio dai 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.
Pubblicare codice scalabile che puoi aggiornare
Le app integrate nei dispositivi IoT devono includere codice scalabile che puoi aggiornare facilmente. Assicurati di testare attentamente i casi d'uso, di tenere conto degli scenari in cui potresti aumentare esponenzialmente la base utenti 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.