Bonjour a tous.

Je developpe une application angular2. J'aimerais communiquer en temps réel avec une api créée en php ( symfony ). La solution que j'ai trouvé la plus simple est d'utiliser les oservables afin de communiquer à l'api pendant une periode de temps. Par exemple:

ngOnInit(){
    this.getDatas();
 }

  getDatas(): void {
    this.timerSubscription = Observable.timer(5000)
      .subscribe(() => this.refreshData());
  }

  refreshData( id ){
    //Communiquer ici avec l'api
   }

Donc, l'observable se charge d'executer chaque 5 seconde la fonction qui communique avec l'api pour recuperer les données. Ca fonctionne mais j'ai quelques soucis.
1- Imaginons qu'il y a plusieurs utilisateurs. Est ce qu'ici, envoyer une requette au serveur a chaque 5 secondes ne va pas le surcharger trop?
2- Chaque requette envoyé au serveur recupère les meme données meme s'il n'y a pas de mises a jour, est ce qu'il un moyen de recuperer seulement les nouvelles données, et l'ajouter a celles qui existent deja dans la vue?

Merci par avance de vos aides.
Help!!!!!!

7 réponses


ben pour surcharger un serveur, faut y aller quand meme... enfin ca depend de ce que tu entend par plusieurs utilisateurs. (une centaine simultanée pas de soucis, plusieurs millions, alors oui... t'aura un pb...)

ensuite, tu peux peut etre imaginé des astuces pour ne renvoyer que ce qu'il y a de nouveau. du genre pour un chat, tu recharges pas toutes les secondes les 10 000 messages du type. au debut tu recup genre les 20 derniers (a l'initilisation) mais ensuite, tu ne recupère que les nouveaux messages.

Ben... Par plusieurs utilisateurs je fais référence aux clients. En effet, c'est une application sociale où il me faut récupérer les publications des utilisateurs. Le fil d'actualités doit être constamment mis à jour

Dans ce cas je ferais un système d'API en me basant sur celle de Twitter (https://dev.twitter.com/rest/public/timelines).

Pour récupérer les messages lors du premier appel et pour récupérer les ancients messages:

GET /messages
  - createdBefore : number // permet une pagination. Cette variable est vide lors du premier appel et ensuite doit être le timestamp du plus vieux message.
  - count: number // le nombre de messages à retourner

Pour récupérer les nouveaux messages:

 GET /messages
   - modifiedAfter: number // cette valeur correspond au timestamp du message le plus récent.
   - count: number // le nombre de messages à retourner

Heu.. Oui, j'arrive a contourner mon probleme plus facile en utilisant un serveur push que dje developp[e en node Js.
Le scenario se deroule comme suit: Quand il ya dun nouveau post, symfony envoie une notification au serveur push avec les donnees du post. Node lui meme se charge d'envoyer ses nouvelles donnees a angular.

Mais je debute en node, et j'ai pas encore toutes les notions. En effet, mon serveur push envoie les donnees a tous les clients connecte au serveur push, mais je ne veux envoyer ces donnees qu'a un certains nombre bien de client bien determiner. Comment filtrer la communication?

Heu je ne veux pas vraiment touche a firebase. C'est moi qui dois en effet developper l'api. Je n'ai aucun probleme la-dessus. Je recupere bien mes donnees a present. Ce dont j'ai besoin, c'est de choisir a quel client je veux envoyer mes notifications depuis nodeJs et tout sera nickel.

Si ya pas moyen de faire ca depuis node, j'ai deja une alternative. En effet, je peux mettre dans chaque message un tableau comprenant une liste d'identifiant, qui sera l'identifiant de ceux qui pourront recevoir le nouveau message. Une fois arriver cote client, je verifie si l'identifiant du client fait partie de la liste d'identifiant qui se trouve dans le message. J'envisagerai cette solution si je ne trouve pas un moyen cote node.

plusieurs solutions.

Soit tu fait : l'utilisateur demande si il y a des trucs a mettre a jour pour lui (en envoyant un user_id par exemple) et le serveur lui répond

Sinon avec socket.io tu va pouvoir te faire du temps reel entre un utilisateur et un serveur dans un tunnel dédié.

a toi ensuite de renvoyer sur le bon socket pour que seulement cet utilisateur recoive la MAJ.

Je ne pense pas que tu puisse faire du push ciblé comme ca facilement.