MISE À JOUR : 12 février 2018 - iOS Firestore SDK v0.10.0
Comme d'autres commentateurs, j'ai également remarqué un ralentissement de la réponse lors de la première demande d'accès (les demandes suivantes prenant ~100 ms). Pour moi, ce n'est pas aussi grave que 30s, mais peut-être autour de 2-3s lorsque j'ai une bonne connectivité, ce qui est suffisant pour fournir une mauvaise expérience utilisateur lorsque mon application démarre.
Firebase a fait savoir qu'ils sont conscients de ce problème de "démarrage à froid" et qu'ils travaillent sur une solution à long terme - pas d'ETA malheureusement. Je pense que c'est un problème distinct que lorsque j'ai une mauvaise connectivité, il peut prendre des âges (plus de 30s) avant d'obtenir des demandes de décider de lire à partir du cache.
En attendant que Firebase corrige tous ces problèmes, j'ai commencé à utiliser la nouvelle fonction disableNetwork()
y enableNetwork()
(disponible dans Firestore v0.10.0) pour contrôler manuellement l'état en ligne/hors ligne de Firebase. Bien que j'aie dû très attention à l'endroit où je l'utilise dans mon code, car il existe un bogue de Firestore qui peut provoquer un crash dans certains scénarios.
UPDATE : 15 Nov 2017 - iOS Firestore SDK v0.9.2
Il semble que le problème de lenteur des performances soit maintenant résolu. J'ai refait les tests décrits ci-dessous et le temps nécessaire à Firestore pour renvoyer les 100 documents semble maintenant se situer autour de 100 ms.
Je ne sais pas si c'était un correctif dans le dernier SDK v0.9.2 ou si c'était un correctif backend (ou les deux), mais je suggère que tout le monde mette à jour ses pods Firebase. Mon application est nettement plus réactive, comme elle l'était avec la Realtime DB.
J'ai également découvert que Firestore est beaucoup plus lent que Realtime DB, en particulier lors de la lecture de nombreux documents.
Tests mis à jour (avec le dernier iOS Firestore SDK v0.9.0) :
J'ai mis en place un projet de test dans iOS Swift en utilisant à la fois RTDB et Firestore et j'ai exécuté 100 opérations de lecture séquentielles sur chacun. Pour RTDB, j'ai testé les méthodes observeSingleEvent et observe sur chacun des 100 nœuds de niveau supérieur. Pour Firestore, j'ai utilisé les méthodes getDocument et addSnapshotListener sur chacun des 100 documents de la collection TestCol. J'ai effectué les tests avec la persistance sur disque activée et désactivée. Veuillez vous référer à l'image jointe, qui montre la structure des données pour chaque base de données.
J'ai effectué le test 10 fois pour chaque base de données sur le même appareil et un réseau wifi stable. Les observateurs et les listeners existants ont été détruits avant chaque nouvelle exécution.
Méthode Realtime DB observeSingleEvent :
func rtdbObserveSingle() {
let start = UInt64(floor(Date().timeIntervalSince1970 * 1000))
print("Started reading from RTDB at: \(start)")
for i in 1...100 {
Database.database().reference().child(String(i)).observeSingleEvent(of: .value) { snapshot in
let time = UInt64(floor(Date().timeIntervalSince1970 * 1000))
let data = snapshot.value as? [String: String] ?? [:]
print("Data: \(data). Returned at: \(time)")
}
}
}
Méthode d'observation de la DB en temps réel :
func rtdbObserve() {
let start = UInt64(floor(Date().timeIntervalSince1970 * 1000))
print("Started reading from RTDB at: \(start)")
for i in 1...100 {
Database.database().reference().child(String(i)).observe(.value) { snapshot in
let time = UInt64(floor(Date().timeIntervalSince1970 * 1000))
let data = snapshot.value as? [String: String] ?? [:]
print("Data: \(data). Returned at: \(time)")
}
}
}
Méthode getDocument de Firestore :
func fsGetDocument() {
let start = UInt64(floor(Date().timeIntervalSince1970 * 1000))
print("Started reading from FS at: \(start)")
for i in 1...100 {
Firestore.firestore().collection("TestCol").document(String(i)).getDocument() { document, error in
let time = UInt64(floor(Date().timeIntervalSince1970 * 1000))
guard let document = document, document.exists && error == nil else {
print("Error: \(error?.localizedDescription ?? "nil"). Returned at: \(time)")
return
}
let data = document.data() as? [String: String] ?? [:]
print("Data: \(data). Returned at: \(time)")
}
}
}
Méthode Firestore addSnapshotListener :
func fsAddSnapshotListener() {
let start = UInt64(floor(Date().timeIntervalSince1970 * 1000))
print("Started reading from FS at: \(start)")
for i in 1...100 {
Firestore.firestore().collection("TestCol").document(String(i)).addSnapshotListener() { document, error in
let time = UInt64(floor(Date().timeIntervalSince1970 * 1000))
guard let document = document, document.exists && error == nil else {
print("Error: \(error?.localizedDescription ?? "nil"). Returned at: \(time)")
return
}
let data = document.data() as? [String: String] ?? [:]
print("Data: \(data). Returned at: \(time)")
}
}
}
Chaque méthode imprime essentiellement l'horodatage unix en millisecondes lorsque la méthode commence à s'exécuter, puis imprime un autre horodatage unix lorsque chaque opération de lecture revient. J'ai pris la différence entre le timestamp initial et le dernier timestamp à retourner.
RÉSULTATS - La persistance du disque est désactivée :
RÉSULTATS - Persistance du disque activée :
Structure des données :
Lorsque les méthodes getDocument / addSnapshotListener de Firestore se bloquent, elles semblent se bloquer pendant des durées qui sont approximativement des multiples de 30 secondes. Peut-être cela pourrait-il aider l'équipe de Firebase à isoler l'endroit du SDK où le blocage se produit ?
0 votes
Quelles performances constatez-vous si vous effectuez un deuxième appel (vers un autre document / collection) ? Le même problème se pose-t-il si vous n'utilisez pas angularfire ?
0 votes
J'ai une expérience similaire. Le premier appel est un peu lent, 5-10s parfois. Je suis en train de créer une application de chat - le premier message met un certain temps à arriver, mais les suivants sont presque instantanés. Firestore est encore en version bêta, ils sont probablement encore en train de régler les problèmes.
1 votes
Expérience similaire ici. Le premier onSnapShot prend un temps fou - jusqu'à 2 minutes pour certains utilisateurs - ce qui rend notre application inutilisable.
0 votes
Même problème, assez frustrant. Certains signalent que le fait d'effectuer une écriture libère les requêtes "suspendues".
0 votes
Même problème, jusqu'à 1,5 minutes avec un simple collection.get(document)
0 votes
La couche hors ligne est le coupable. Si vous n'exécutez pas "enablePersistence()", l'application s'accélère immédiatement. Nos observations proviennent principalement de dispositifs Android (utilisant Cordova).
0 votes
Ce problème existe-t-il encore ?
0 votes
Maintenant la base de données en temps réel firebase dans Android (activer le mode hors ligne) a aussi ralenti au début, j'ai été obligé d'utiliser REST en utilisant les fonctions du cloud qui est beaucoup plus rapide.
0 votes
De nouveaux conseils, maintenant que Firestore est prêt pour la production ?
0 votes
Juste pour confirmer que je peux toujours reproduire le problème.... environ 8 secondes pour récupérer un seul document.
await firestore.collection("photos").doc(id).get()
0 votes
Mais la question reste valable :)
0 votes
J'ai une collection avec 1 document avec 3 champs dedans et pas de requête spéciale (juste me renvoyer tout), et cela prend environ 3 secondes pour renvoyer les données. Je suis très inquiet d'investir plus de temps si c'est la performance quand il n'y a pas de travail à faire.