AFNetworking et nombre d'opérations concurrentes en batch

Salut,
J'ai un soucis de synchronisation client => serveur.
En gros, au lieu de lancer 1 synchro pour envoyer les éléments JSON du client au serveur, je dois en lancer 4 ou 5 environ à la suite.
1) Je ne reçois pas d'erreur sur le client.
2) Je ne vois pas d'erreur dans les logs du serveur.
Je me demande si AFNetworking ne mange pas des requêtes, mais connaissant sa fiabilité, je doute.
Voilà côté client, je crée ma boucle d'opérations/requêtes:
Puis, je passe la liste des opérations à mon HTTPCLient :
J'arrive à voir que j'ai environ 255 opérations à envoyer. Hors, je sais qu'il en réalisera environ 70 lors de la première synchro. (je le contrôle sur le serveur)
Je le vois même avec ma ProgressView, au début je vois la barre avancer à chaque opération, et puis à 1/3 de la barre, d'un seul coup, il avance jusqu'à la fin (au lieu d'être régulier), et l'app m'annonce la synchronisation finie.
Mais où sont passées 2/3 des requêtes ?
Une surcharge serveur peut-elle en être la cause ?
Dans ce cas, pourquoi je ne récupère pas d'erreurs dans :
J'ai un soucis de synchronisation client => serveur.
En gros, au lieu de lancer 1 synchro pour envoyer les éléments JSON du client au serveur, je dois en lancer 4 ou 5 environ à la suite.
1) Je ne reçois pas d'erreur sur le client.
2) Je ne vois pas d'erreur dans les logs du serveur.
Je me demande si AFNetworking ne mange pas des requêtes, mais connaissant sa fiabilité, je doute.
Voilà côté client, je crée ma boucle d'opérations/requêtes:
{<br />
[font=Monaco][size=2][color=#4f8187] AFJSONRequestOperation[/color] *operation = [[color=#bb2ca2]self[/color] [color=#31595d]operationWithRequest[/color]:request];[/size][/font]<br />
[font=Monaco][size=2] [operations [color=#3d1d81]addObject[/color]:operation];[/size][/font]<br />
}
Puis, je passe la liste des opérations à mon HTTPCLient :
[/size][/font][font=Monaco][size=2][[[color=#4F8187]HTTPClient[/color] [color=#31595D]sharedClient[/color]] [color=#31595D]enqueueBatchOfHTTPRequestOperations[/color]:operations [color=#31595D]progressBlock[/color]:^([color=#703DAA]NSUInteger[/color] numberOfCompletedOperations, [color=#703DAA]NSUInteger[/color] totalNumberOfOperations)[/size][/font]<br />
[font=Monaco][size=2] {[/size][/font]<br />
[font=Monaco][size=2] [[color=#bb2ca2]self[/color] [color=#31595d]calculateProgressViewWithTotalWritten[/color] <img src='http://forum.cocoacafe.fr/public/style_emoticons/<#EMO_DIR#>/sad.png' class='bbc_emoticon' alt=':(' />[color=#bb2ca2]int[/color])numberOfCompletedOperations [color=#31595d]totalToWrite[/color] <img src='http://forum.cocoacafe.fr/public/style_emoticons/<#EMO_DIR#>/sad.png' class='bbc_emoticon' alt=':(' />[color=#bb2ca2]int[/color])totalNumberOfOperations];[/size][/font]<br />
[font=Monaco][size=2] } [/size][/font]<br />
[font=Monaco][size=2] [color=#31595d]completionBlock[/color]:^([color=#703daa]NSArray[/color] *operations) [/size][/font]<br />
[font=Monaco][size=2] {[/size][/font]<br />
[color=#008400][font=Monaco][size=2][color=#000000] [/color]// push is finished[/size][/font][/color]<br />
[color=#008400][font=Monaco][size=2][color=#000000] [/color]// stop all[/size][/font][/color]<br />
[color=#31595D][font=Monaco][size=2][color=#000000] [[/color][color=#bb2ca2]self[/color][color=#000000].[/color][color=#4f8187]delegate[/color][color=#000000] [/color]syncServicesControllerIsStoping[color=#000000]:[/color][color=#bb2ca2]self[/color][color=#000000]];[/color][/size][/font][/color]<br />
[color=#31595D][font=Monaco][size=2][color=#000000] [[/color][color=#bb2ca2]self[/color][color=#000000].[/color][color=#4f8187]delegate[/color][color=#000000] [/color]syncServicesController[color=#000000]:[/color][color=#bb2ca2]self[/color][color=#000000] [/color]didSyncWithSuccess[color=#000000]:[/color][color=#bb2ca2]YES[/color][color=#000000]];[/color][/size][/font][/color]<br />
[font=Monaco][size=2] }];
J'arrive à voir que j'ai environ 255 opérations à envoyer. Hors, je sais qu'il en réalisera environ 70 lors de la première synchro. (je le contrôle sur le serveur)
Je le vois même avec ma ProgressView, au début je vois la barre avancer à chaque opération, et puis à 1/3 de la barre, d'un seul coup, il avance jusqu'à la fin (au lieu d'être régulier), et l'app m'annonce la synchronisation finie.
Mais où sont passées 2/3 des requêtes ?
Une surcharge serveur peut-elle en être la cause ?
Dans ce cas, pourquoi je ne récupère pas d'erreurs dans :
- ([color=#4f8187]AFJSONRequestOperation[/color]*)operationWithRequest:([color=#703daa]NSMutableURLRequest[/color]*)request
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je ne sais pas si ça peut être une piste pour toi mais dans mon cas, ça a résolu le souci.
Ce ne sont que des POSTS qui tapent la même URL: "services/push_item"
Mais envoient du contenu différent (différent modèles, différents champs). Un problème possible avec le cache ?
Donc mes requêtes sont bien quelque part...
failure Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo=0xb9ad300 {NSErrorFailingURLStringKey=http://www.app.com/services/push_item, NSErrorFailingURLKey=http://www.app.com/services/push_item, NSLocalizedDescription=The request timed out., NSUnderlyingError=0xb8da7c0 "The request timed out."}
Des pistes:
https://github.com/A...king/issues/564
La synchronisation semble bien plus lente, mais au moins ça marche.
Je n'ai plus de Timeouts.
Je suppose qu'il doit y avoir un goulot d'étranglement quelque part. J'envoie des images de 200 Ko environ pendant la synchro, associées à mon modèle. Et côté serveur Rails envoie les images sur Amazon S3... Peut-être que le serveur ne sait pas gérer tout ça si 15 images arrivent en même temps ?
Il me semble cependant que ça marchait très bien les premiers mois... (iOS 6.1 peut être une autre piste)
Je n'avais pas vu qu'on pouvez paramétrer l'operationQueue de AF directement, je vais modifier mon code du coup, mais en gros c'est ce que je t'avais dis ...
=> La synchro a pris 3min 30
=> La synchro a pris 7 min
Je suppose que le bug serait dû au fait que l'application analyse mal la capacité du serveur à répondre à la demande ou la vitesse du réseau ? Car maxConcurrentOperationCount devrait être trouvé par le framework en fonction de la quantité de donnée envoyée ?
C'est flou ça:
De mon côté je lance des requêtes de DL, quand mon API retournait 10 items ça allé, mais maintenant ça en retourne 600, donc j'ai vite compris que 600 requêtes de download de fichier sur mon S3, il fallait calmer un peu les ardeur de AF, j'ai fais un set à 5 et ça marche nickel.
Je suis assez étonné de la lenteur du coup... mais bon, j'ai 300 Ko environ à envoyer à chaque requête (sachant que mon serveur fait l'aller-retour avec S3 à chaque requête...).
Est-ce que ma config de Nginx peut répondre à cette question ou c'est autre chose ?
Je ne connais pas bien nginx mais j'ai vu le mot clé 'limit_conn' ici :
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
Qui permet de limiter le nombre de connections par client ou par vhost.