IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] Optimisation de charge, liée à une requete récurente


Sujet :

AJAX

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 27
    Par défaut [AJAX] Optimisation de charge, liée à une requete récurente
    Bonjour,

    Tout d'abord je ne suis pas certain de poster sur le bon Forum, j'ai hésité avec le forum dédié au Javascript. Mais comme j'utilise de l'Ajax j'ai choisi ce forum ci, J’espère que je ne me suis pas planté.

    Ors donc, je suis actuellement entrain de tenter de développer un petit chat en navigateur tout simple.
    Le seul objectif que je me soit fixé comme indispensable est de ne jamais rafraichir toute la page, seulement la zone ou sont afficher les messages. Et ça marche bien, mais j'ai un problème sur le fond.

    Pour rafraichir la zone des message j'effectue une requête toutes les 1 secondes à mon contrôleurs pour lui demander si il n'y à pas un nouveau message. Lui même fait une requête à la base de donnée.

    Bref ça sature tout d'un bout a l'autre, c'est immonde, et je suis sur qu'on peut faire autrement.

    J'ai penser à faire en sort que la requête AJAX envois l'id du dernier message qui est afficher, et que le contrôleur ne réponde rien tant qu'il n'y a pas de nouveau message à afficher. On va dire que cet requête sera relancer toutes les 5 minutes.

    Cet solution allège les échanges Client-Seveur, mais ça oblige quand même à avoir une boucle dans le contrôleur qui fait une requête à la base de donnée toutes les secondes. Laquelle boucle s’arrêtant automatiquement au bout de 5 minutes, évitant ainsi la boucle infini de la mort.

    EDIT: Non attendez je raconte n'importe quoi -_- en 5 minutes le client va conclure a un timeout du serveur, erreur 408 tout ça. C’était une idée de merde.

    Mais ça me parais toujours comme quelque chose de moche et lourd. Je sent qu'un truc m’échappe dans ce problème. Avez vous des idée à me proposer ?

    Cordialement

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 207
    Par défaut
    Bonjour,
    comme élément de réponse je te propose la lecture d'un article que nous à mis à disposition christele_r.
    AJAX en clair, voir le §5

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Tu tombes bien je viens de finir un article:
    un Tchat complet en AJAX
    http://ajax.developpez.com/tutoriels...ajax-en-clair/

    A++
    Christele
    Pile-Poil la même heure ... et merci a toi

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 27
    Par défaut
    Effectivement je viens de finir de lire ton article, fort sympa au passage.
    Ça apporte beaucoup à la conception de mon outil, et ma connaissance de l'AJAX. Mais il me reste une petite question concernant le rafraichissement du chat :

    Je remarque, que tu rafraichi le tchat toutes les 5 secondes. Et c'est ce point que je voudrais améliorer. J'aimerai arriver à me rapprocher le plus possible d'un système de messagerie instantané ou "quasi-instantané" au point que la latence n'est pas discernable par Mme Michu. Comme ceux qu'on peut voir dans Gtalk ou Facebook.

    Comment font ces services pour s'actualiser si vite ? Coté Client<->Serveur ce n'est pas très difficile puis-qu'on peut simplement laisser trainer une requête Javascript sur la page du client, qui va attraper les nouveau messages et signaler régulièrement que le client est toujours la.

    Mais au niveau Serveur<->DB la je ne vois pas comment ils peuvent faire pour ne pas spammer complètement leur DB de requêtes . Ou alors ils ont un outils spécifiquement dédier à cet tache qui se comporte nativement comme un client de messagerie instantané type MSN. Et qui transmet les message en live à leur destinataires tout en les enregistrant en DB dans le même temps.

    Qu'en pensez vous ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Non... tu rafraichi comme tu veux,change le timeout, mais je penses
    que tu n'imagines pas clairement la puissance du serveur de ton site,
    et du tuyaux qui le relie au mond, par rapprt aux serveurs et
    multi-cable optique d'un facebook ! as tu eu la curiositée de
    regarder leur code ?

    A++
    christele

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 27
    Par défaut
    Effectivement je n'ai pas une formation en reseau, et ce n'est pas moi qui ai mis en place le serveur sur le quel tourne mon site. Pas plus que celui ou tourne sa db. Je sais par contre que l'intégrateur web et l'administrateur système avec les quel je travailles ne se priverons pas de dire que c'est de ma faute si tout se met a tournée au ralentis. Car du reste c'est déjà arriver :p (et c'était pas ma faute)

    Aussi j'assure un maximum mes arrière sur ce coup la

    J'ai survoler les requêtes AJAX de Gtalk grâce à firebug. Et ça ne m'a pas appris grand choses. Il fait régulièrement (toutes les 3 à 4 minutes environs) une requête en GET à une adresse toujours la même, seul un des paramètre envoyer change. Autour de ça beaucoup d'autre requêtes sont lancer mais elle sont toutes résolue en moins de 5 seconde, et très souvent moins d'une seconde.

    Mais bon comme j'ai dit la communication client serveur, peut être facilement cadencer pour ne pas avoir à "spammer" les requêtes. Ce que je me demande c'est comment leur serveurs peut savoir facilement qu'il y a un nouveau message.

    Mais bon, à coté de ça si tu me dit que faire une requête par seconde pour savoir il y a un nouveau message en DB (sachant qu'on connais l'id du dernier message envoyer au client, ce qui facilite la recherche) n'est pas quelque chose de lourd alors je te crois. Après tout moi j'y connais rien ^^

    Cordialement

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Aoernis Voir le message
    Ce que je me demande c'est comment leurs serveurs peut savoir facilement qu'il y a un nouveau message.

    Cordialement
    Tu vois c'est cette phrase qui devrait t'aider a comprendre TOUT ! et ne plus te poser des questions a tort !

    Car la réponse a ta question est simple ... le serveur sait qu'il a un nouveau message immédiatement quand celui-ci arrive, et il renvoie immédiatement dans le millième de seconde la nouvelle liste au client qui vient de poster , c'est élémentaire.
    Les autres (par exemple les 500 autres visiteurs ...) ne savent pas que ton message existe, mais dans 1,2,3 secondes il vont le voir !!

    car rappelle-toi que la requête ne peut'être que client ==> serveur ...
    voila pourquoi
    Christele

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 207

  9. #9
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Vouloir mettre en place un chat sans connaitre certains fondamentaux des échanges client / serveur, c'est limite suicidaire...

    Je remarque, que tu rafraichi le tchat toutes les 5 secondes. Et c'est ce point que je voudrais améliorer. J'aimerai arriver à me rapprocher le plus possible d'un système de messagerie instantané ou "quasi-instantané" au point que la latence n'est pas discernable par Mme Michu. Comme ceux qu'on peut voir dans Gtalk ou Facebook.
    Je ne crois vraiment pas que Mme Michu en ai quelque chose à faire que les messages aient (au plus) 5 secondes de retard ! Raccourcir le délai entre les interrogations serveur, c'est surtout multiplier le nombre de requêtes et saturer (potentiellement) le serveur inutilement ! Surtout, aucun utilisateur ne sera en mesure de se rendre compte (réellement) d'une éventuelle latence...

    Sinon, concernant les systèmes de chat, il y en a plusieurs possibles.
    Le plus répandu (car le mieux supporté et le plus optimisé niveau performances), c'est celui expliqué par Christelle dans son tutoriel.
    A côté de cela, il existe la possibilité d'utiliser les WebSockets : une connexion que l'on peut qualifier de permanente entre le serveur et le client qui autorise le serveur à envoyer de lui-même des informations au client. Problème, les WebSockets sont encore trop peu supportés par les navigateurs.
    Pour pallier cela, il existe le système dit du long-polling. Le client fait une requête AJAX vers le serveur qui attend d'avoir une information à renvoyer avant de retourner un résultat. Lorsque le résultat est reçu, on relance la requête, si le time limit (temps maximal d'exécution d'une requête) la connexion est coupée et on relance la requête.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 27
    Par défaut
    Merci à tous d'avoir pris le temps de me répondre.

    Effectivement, tout ce que je sais des fondamentaux des échanges client / serveur, c'est que la saturation augmente proportionnellement au volume de donnée et a la fréquence des demandes.

    Je pense que je vais m'orienter sur du long-polling. Parce que ça suffira bien
    Merci pour les explication sur toutes les autres façon de faire. Je me coucherai moins bête ce soir et ça n'a pas de prix.

    PS: Au passage, je n'ai jamais voulu critiquer la teneur de l’excellent article de christele_r dont je recommanderai volontiers la lecture.

Discussions similaires

  1. Optimisation du LIKE dans une Requete SQL
    Par maxwel56 dans le forum Requêtes
    Réponses: 3
    Dernier message: 11/02/2012, 22h36
  2. [AJAX] load() ne charge pas ma requete sql
    Par traderjean dans le forum AJAX
    Réponses: 0
    Dernier message: 08/01/2012, 10h56
  3. Réponses: 2
    Dernier message: 29/06/2011, 09h51
  4. optimisation d'une requete de recherche
    Par moog dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 06/04/2005, 16h58
  5. [OPTIMISATION] [UNION] Union dans une requete
    Par nico44 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/03/2005, 12h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo