Servlet rapide en local mais très lent à distance

cs_thedestiny Messages postés 56 Date d'inscription samedi 3 juillet 2004 Statut Membre Dernière intervention 30 juin 2008 - 29 juin 2008 à 21:15
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 30 juin 2008 à 12:49
Bonjour,

Cela fait plusieurs jous que je planche sur le problème et je coince un peu donc je viens soliciter votre aide.
Je développe une application client (J2SE pour le riche, GWT pour le light) qui doit récupérer des informations continue au sein d'une base de données MySQL en interrogeant une servlet (requête HTTP classique) qui se chargera de récupérer les informations de la base, de les mettre en forme puis de générer la réponse sous la forme d'un fichier XML qui sera parsé par les différents clients. Ca reste une architecture 3 tiers relativement classique.

Mon problème, c'est qu'en local, l'envoi d'une requête + traitement prend entre 60 et 200ms selon le volume d'informations. Mais après quelques tests, à distance ça se gatte car on ne descend pas sous la barre des 9000ms, comme-ci les clients devaient impérativement attendre 9 secondes avant de continuer l'execution.
J'ai essayé divers solutions sans succès: ajout du header Connection: close, au niveau du servlet, passage de Glassfish à Tomcat, envoi de la connexion en utilisant directement les sockets au lieu de la classe URL, rien y fait. Donc si vous avez des choses à me faire tester je vous en serai très reconnaissant!

Amicalement,
The Destiny

3 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
29 juin 2008 à 21:26
Salut,

9 secondes, ca correspond à l'envoi de la requête au serveur, le traîtement de cette dernière, l'exécution de ta servlet (connection à la base, récupèration des données, formattage des données au bon format) et enfin, l'envoi de la réponse au client pour qu'il puisse la traîter.

en local, les 200 ms ne correspondent qu'à l'exécution de la servlet. Tu aura beau optimiser au maximum l'éxécution de la servlet, tu n'y gagnera pas les 9000 ms !

Ce que tu oublie de nous dire, c'est : est-ce que les données transitants entre le serveur et le client sont importantes... si tu dois envoyer plusieurs Mo par exemple, ca n'a rien d'étonnant !

Tu devrais plutôt envisager d'optimiser le volume de données allant du serveur vers le client : utilisation de JSon à la place de XML par exemple, faire des requêtes AJAX asynchrone plutôt que des requêtes HTTP "classique" synchrone, etc.
______________________________________
DarK Sidious
0
cs_thedestiny Messages postés 56 Date d'inscription samedi 3 juillet 2004 Statut Membre Dernière intervention 30 juin 2008
30 juin 2008 à 09:39
Merci pour la réponse déjà ;)

En gros tu résumes bien le mécanisme:
Envoi d'une requête POST/GET - Traitement de la requête par le servlet - Interrogation de la bdd (la connexion se fait au lancement de la servlet) - Formattage des données - Génération du contenu RDF (format basé sur XML) - Parsing de la réponse par le client - Affichage des infos

Les données qui transitent sont actuellement de l'ordre de la 10aine voir 100aine de ko.. A l'avenir il pourrait éventuellement y avoir des réponses de plusieurs mo d'où mon inquiètude... (les derniers servlets que j'ai fait, même s'ils étaient moins "lourd" ne prenait pas autant de temps à s'executer)

Le protocole HTTP est imposé du fait que le servlet doit pouvoir communiquer avec le client malgré les proxy, les routeurs, les pare-feu etc... qui trainent sur le réseau.

A priori, rien que pour se connecter à la servlet, cela prendrait 4 secondes :/

Amicalement,
The Destiny
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
30 juin 2008 à 12:49
Salut,

Donc tu n'as guère le choix : cela vient de l'infrastructure du réseau en lui même : 4 secondes pour que la servlet commence son éxécution, et 4 secondes pour la requête de retour, + quelques ms pour le traîtement par la servlet... tu tombe sur environ 9 secondes bizarrement ;)

AJAX, ce n'est que des requêtes HTTP, mais se faisant de façon asynchrone. Ca ne changera pas grand chose au niveau proxy, parefeu, etc, mais ca te permettra surtout de faire des requêtes HTTP un peu plus légères.
______________________________________
DarK Sidious
0
Rejoignez-nous