2009-11-05 5 views
4

Je suis à la recherche d'un bon moyen de mettre en œuvre un flux en temps réel pour mes utilisateurs sur une application Rails (serveur de passagers Phusion). Chaque flux peut être différent en fonction de l'utilisateur et je pense avoir un nouvel article tous les 20 - 60 ans. La requête ajax périodique ne semble pas être la meilleure façon de le faire pour moi.Temps réel avec Rails

J'ai entendu parler Comet et je pensais que d'avoir quelque chose comme ceci: - L'utilisation d'un XMLHttpRequest à long polling attendre un ping du serveur - Une fois que le serveur envoie une requête ping les derniers articles avec ajax - Démarrez une autre XMLHttpRequest

Y at-il un problème avec cela? Y a-t-il des moyens plus faciles et plus efficaces de le faire?

Merci, S.

+0

Je ne comprends pas votre problème. Essayez-vous de mettre en place un flux d'activité utilisateur (comme Facebook)? – knoopx

+0

Ce serait plus comme friendfeed. – user203616

Répondre

4

En termes d'applications Web (et par extension Rails applications), en temps réel est une illusion. Une longue interrogation est une approximation très proche. Malheureusement, ce n'est pas bien adapté à Rails. Encore moins sur le passager.

L'interrogation longue nécessite une connexion ouverte permanente pour chaque utilisateur, ce qui n'est pas très important sur les serveurs qui n'ont pas été conçus pour le gérer (comme Apache). Malheureusement, il y a vraiment beaucoup de serveurs conçus pour une longue évolutivité d'interrogation qui fonctionne bien avec Rails. Vous pouvez essayer le serveur Shooting-Star, mais je n'ai aucune idée de la façon dont sa performance se compare à celle de Passenger, pour vos demandes standard.

Mon opinion personnelle sur les longues interrogations est que c'est une solution qui a besoin d'un problème.

Vraiment, vous devriez vous poser les questions suivantes:

  • ce que ces mises à jour d'une priorité suffisamment élevée qu'ils ne peuvent pas attendre 40 secondes? Que va-t-il se passer si les mises à jour ne sont pas reçues immédiatement?
  • Est-ce que mes utilisateurs vont tellement se concentrer sur mon application qu'attendre 15 secondes va avoir un impact négatif sur leur expérience?
  • Quel pourcentage de l'attention d'un utilisateur mon application attire-t-elle dans des conditions normales d'utilisation?
  • Combien de temps faut-il pour répondre à une mise à jour?
  • Faut-il vraiment besoin d'être en temps réel?

Certaines de ces questions posent d'autres questions d'une manière différente, mais c'est un peu nécessaire avec de telles questions subjectives.

Je pense que vous voyez ce que je veux dire: Les mises à jour en temps réel sont très agréables, mais jamais vraiment nécessaires. Si vous travaillez sur quelque chose où la conséquence de ne pas réagir à une mise à jour en temps réel est la fin du monde. Vous ne devriez vraiment pas le développer en tant qu'application web.

Si vous avez encore votre avis sur les mises à jour en temps réel, vous pouvez regarder Juggernaut. Mais c'est une solution basée sur Flash.

+2

Il y a beaucoup d'occasions où le long sondage a du sens. Supposons que vous attendiez la fin d'un processus d'arrière-plan asynchrone. Si l'utilisateur attend que cela se produise, vous avez besoin de requêtes XHR à interrogation longue ou rapide. – ghayes

4

Friendfeed a construit le Tornado server en Python dont il a ouvert l'accès.

Nous avons examiné un certain nombre d'options XMPP qui sont assez compliquées à mettre en place, avant d'utiliser le nginx_http_push_module. Les requêtes HTTP GET de longue durée y sont connectées, et l'application rails repousse les requêtes à nginx. Nginx transfère également des requêtes dynamiques à un groupe de métis. Nous avons quelques jQuery en cours d'exécution qui ouvre la connexion puis la rouvre au serveur quand il reçoit un message, ou quand il y a une erreur. De cette façon, nous sommes en mesure de réaliser des mises à jour en temps quasi réel dans le style Comet.

Cette blog post on the nginx module with a ruby example devrait vous aider à démarrer (compiler nginx). Nous sommes en cours de développement en ce moment et nous prévoyons de l'utiliser dans la production à moins que cela ne se révèle peu fiable, jusqu'ici tout va bien.