Il existe plusieurs façons d'améliorer les performances de Firebase Realtime Database dans votre application. Pour savoir comment optimiser les performances de Realtime Database, collectez des données à l'aide des différents outils de surveillance de Realtime Database, puis modifiez votre application ou l'utilisation de Realtime Database en conséquence.
Surveiller les performances de Realtime Database
Vous pouvez collecter des données sur les performances de votre Realtime Database à l'aide de différents outils, en fonction du niveau de précision dont vous avez besoin :
- Présentation générale : utilisez l'outil de profilage pour obtenir la liste des requêtes non indexées et une présentation en temps réel des opérations de lecture/écriture.
- Estimation de l'utilisation facturée : utilisez les métriques d'utilisation disponibles dans la console Firebase pour afficher votre utilisation facturée et vos métriques de performances générales.
- Analyse détaillée : utilisez Cloud Monitoring pour examiner plus en détail les performances de votre base de données au fil du temps.
Améliorer les performances par métrique
Une fois que vous avez collecté des données, explorez les bonnes pratiques et stratégies suivantes en fonction du domaine de performances que vous souhaitez améliorer.
| Stratégies d'amélioration des performances en un coup d'œil | ||
|---|---|---|
| Métrique | Description | Bonnes pratiques |
| Charge/Utilisation | Optimisez la part de la capacité de votre base de données utilisée pour traiter les requêtes à un moment donné (reflétée dans les métriques **Charge** ou **io/database_load**). |
Optimiser la structure de vos données Segmenter les données entre les bases de données Améliorer l'efficacité des écouteurs Limiter les téléchargements avec des règles basées sur des requêtes Optimiser les connexions |
| Connexions actives | Équilibrez le nombre de connexions actives simultanées à votre base de données pour rester sous la limite de 200 000 connexions. |
Segmenter les données entre les bases de données Réduire les nouvelles connexions |
| Bande passante sortante | Si les téléchargements depuis votre base de données semblent plus élevés que vous ne le souhaitez, vous pouvez améliorer l'efficacité de vos opérations de lecture et réduire la surcharge de chiffrement. |
Optimiser les connexions Optimiser la structure de vos données Limiter les téléchargements avec des règles basées sur des requêtes Réutiliser les sessions SSL Améliorer l'efficacité des écouteurs Limiter l'accès aux données |
| Stockage | Assurez-vous de ne pas stocker de données inutilisées ou répartissez vos données stockées dans d'autres bases de données et/ou produits Firebase pour ne pas dépasser le quota. |
Nettoyer les données inutilisées Optimiser la structure de vos données Segmenter les données entre les bases de données Utiliser Cloud Storage for Firebase |
Optimiser les connexions
Les requêtes RESTful telles que GET et PUT nécessitent toujours une connexion, même si celle-ci est de courte durée. Ces connexions fréquentes et de courte durée peuvent en réalité entraîner des coûts de connexion, une charge de base de données et une bande passante sortante nettement plus élevés que les connexions actives en temps réel à votre base de données.
Dans la mesure du possible, utilisez les SDK natifs pour la plate-forme de votre application, plutôt que l'API REST. Les SDK maintiennent des connexions ouvertes, ce qui réduit les coûts de chiffrement SSL et la charge de la base de données qui peuvent s'accumuler avec l'API REST.
Si vous utilisez l'API REST, envisagez d'utiliser un keep-alive HTTP pour maintenir une connexion ouverte ou utilisez des événements envoyés par le serveur, ce qui peut réduire les coûts des handshakes SSL.
Segmenter les données sur plusieurs bases de données
La répartition de vos données sur plusieurs instances Realtime Database, également appelée segmentation de base de données, offre trois avantages :
- Augmentez le nombre total de connexions actives simultanées autorisées sur votre application en les répartissant sur plusieurs instances de base de données.
- Équilibrer la charge entre les instances de base de données
- Si vous avez des groupes d'utilisateurs indépendants qui n'ont besoin d'accéder qu'à des ensembles de données distincts, utilisez différentes instances de base de données pour obtenir un débit plus élevé et une latence plus faible.
Si vous utilisez le forfait Blaze, vous pouvez créer plusieurs instances de base de données dans le même projet Firebase, en utilisant une méthode d'authentification utilisateur commune à toutes les instances de base de données.
Découvrez comment et quand segmenter des données.
Créer des structures de données efficaces
Étant donné que Realtime Database récupère les données des nœuds enfants d'un chemin d'accès ainsi que le chemin d'accès, il est judicieux de conserver une structure de données aussi plate que possible. Vous pouvez ainsi récupérer de manière sélective les données dont vous avez besoin, sans télécharger de données inutiles sur les clients.
En particulier, tenez compte des écritures et des suppressions lorsque vous structurez vos données. Par exemple, la suppression de chemins comportant des milliers de feuilles peut être coûteuse. Les diviser en chemins d'accès avec plusieurs sous-arborescences et moins de feuilles par nœud peut accélérer les suppressions.
De plus, chaque écriture peut consommer jusqu'à 0,1% de l'utilisation totale de votre base de données.
Structurez vos données de manière à pouvoir regrouper les écritures en une seule opération, sous forme de mises à jour multipath, à l'aide des méthodes update() des SDK ou des requêtes RESTful PATCH.
Pour optimiser votre structure de données et améliorer les performances, suivez les bonnes pratiques pour les structures de données.
Empêcher les accès non autorisés
Empêchez les opérations non autorisées sur votre base de données avec Realtime Database Security Rules. Par exemple, l'utilisation de règles peut éviter qu'un utilisateur malveillant télécharge de manière répétée l'intégralité de votre base de données.
En savoir plus sur l'utilisation des règles Firebase Realtime Database
Utiliser des règles basées sur des requêtes pour limiter les téléchargements
Les Realtime Database Security Rules limitent l'accès aux données de votre base de données, mais elles peuvent également servir de limites pour les données renvoyées par les opérations de lecture. Lorsque vous utilisez des règles basées sur des requêtes, telles que définies par des expressions query. comme query.limitToFirst, les requêtes ne récupèrent que les données limitées par la règle.
Par exemple, la règle suivante limite l'accès en lecture aux 1 000 premiers résultats d'une requête, classés par priorité :
messages: {
".read": "query.orderByKey &&
query.limitToFirst <= 1000"
}
// Example query:
db.ref("messages").limitToFirst(1000)
.orderByKey("value")
En savoir plus sur Realtime Database Security Rules.
Index des requêtes
L'indexation de vos données réduit la bande passante totale que vous utilisez pour chaque requête exécutée par votre application.
Réutiliser les sessions SSL
Réduisez les coûts de chiffrement SSL sur les connexions rétablies en émettant des tickets de session TLS. Cela est particulièrement utile si vous avez besoin de connexions fréquentes et sécurisées à la base de données.
Améliorer l'efficacité des écouteurs
Placez vos écouteurs aussi loin que possible dans le chemin d'accès pour limiter la quantité de données qu'ils synchronisent. Vos écouteurs doivent être proches des données que vous souhaitez qu'ils obtiennent. N'écoutez pas à la racine de la base de données, car cela entraînerait le téléchargement de l'intégralité de votre base de données.
Ajoutez des requêtes pour limiter les données renvoyées par vos opérations d'écoute et utilisez des écouteurs qui ne téléchargent que les mises à jour des données (par exemple, on() au lieu de once()). Réservez .once() aux actions qui ne nécessitent vraiment pas de mise à jour des données.
De plus, triez vos requêtes à l'aide de orderByKey(), dans la mesure du possible, pour obtenir les meilleures performances. Le tri avec orderByChild() peut être six à huit fois plus lent, et le tri avec orderByValue() peut être très lent pour les grands ensembles de données, car il nécessite une lecture de l'intégralité de l'emplacement à partir de la couche de persistance.
Veillez également à ajouter des écouteurs de manière dynamique et à les supprimer lorsqu'ils ne sont plus nécessaires.
Nettoyer les données inutilisées
Supprimez régulièrement les données inutilisées ou en double de votre base de données. Vous pouvez exécuter des sauvegardes pour inspecter manuellement vos données ou les sauvegarder régulièrement dans un bucket Google Cloud Storage. Envisagez également d'héberger les données stockées via Cloud Storage for Firebase.
Livrer du code évolutif que vous pouvez mettre à jour
Les applications intégrées aux appareils IoT doivent inclure du code évolutif que vous pouvez facilement mettre à jour. Veillez à tester minutieusement les cas d'utilisation, à prendre en compte les scénarios dans lesquels votre base d'utilisateurs pourrait croître de manière exponentielle et à intégrer la possibilité de déployer des mises à jour de votre code. Réfléchissez bien aux modifications majeures que vous pourriez avoir à apporter par la suite, par exemple si vous décidez de segmenter vos données.