2012-03-23 23 views
1

Also habe ich eine Rails-App (die in diesem Fall scheint, als wäre es irrelevant, aber ich werde es trotzdem erwähnen). Es ist eine Art Chat-Room-Anwendung.Wird die Häufigkeit der Abfragen schneller auf meiner Seite angezeigt?

Um festzustellen, welche Benutzer sich gerade in einem Chat-Raum befinden, habe ich JavaScript-Abfragen verwendet.

So ein einfaches

$(function() { 
    setTimeout(updateUsers, 15000); 
}); 

wo updateUsers nur ruft eine AJAX-Anforderung erhalten das Array von Usern, die gerade im Chat zu ziehen.

Hier ist meine Frage: 15 Sekunden ist eine ziemlich lange Zeit zu warten, um abzufragen. Wie oft sollte ich es ohne Leistungsprobleme machen? Natürlich hängt das von vielen Faktoren ab, aber ich würde gerne diese Faktoren hören. Ich habe eine Reihe von ähnlichen Fragen zum Empfangen von Nachrichten in Chat-Rooms gesehen, aber noch keine für Listen von Benutzern, weshalb ich diese Frage stelle.

Antwort

0

Es hängt von einer Tonne von Dingen, wie Ihre Infrastruktur, die Anzahl der erwarteten Benutzer, etc. Auch wenn wir diese Nummern hatten, ist es schwer zu sagen, was eine gute Auszeit wäre.

Wenn Sie nur ein einfaches JSON-Array mit der Liste der Benutzer senden, würde ich sagen, experimentieren Sie mit einer 3-5 Sekunden Verzögerung und überprüfen Sie von dort aus. Dies ist ein Problem der vorzeitigen Optimierung - Sie versuchen, ein Problem zu lösen, das Sie noch nicht haben.

Es gibt jedoch zwei andere mögliche Lösungen:

Sie könnten nur die Differenz senden. Wenn Sie abfragen, geben Sie eine Nachricht zurück, die angibt, welche Benutzer eine Verbindung hergestellt haben und welche seit dem letzten Abruf übrig geblieben sind. Dies erfordert eine Art Server-Tracking, kann aber durchgeführt werden.

Die andere Lösung wäre, überhaupt keine Abfrage zu verwenden und eine modernere Technologie wie WebSockets/Long-Polling zu verwenden. Diese ermöglichen dem Server selbst, Nachrichten an Ihre Clients zu senden. Als solche können Sie ihnen eine erste Liste senden, wenn sie sich verbinden, und eine einzige minimale Nachricht, jedes Mal, wenn jemand anderes sich verbindet/verlässt. Eine gute Lösung in einer Knotenumgebung ist Socket.IO. Ich bin kein Ruby-Typ, also weiß ich nicht, ob jemand etwas Ähnliches getan hat, aber ich wäre nicht überrascht, wenn jemand das Ganze auf Rails portiert hätte. Suchen Sie herum, ich bin sicher, Sie werden etwas finden, das Ihren Bedürfnissen entspricht.

0

Alle weiteren häufigen fügt eine zusätzliche Last, wenn auch der Server, der Client oder beides.

Nachdem ich das gesagt habe, glaube ich nicht, dass es einen "Sweet Spot" gibt (auf den es sich zu beziehen scheint). Sie können jedoch unter Ruby Push API nachsehen, die eine Verbindung grundsätzlich immer offen hält und Daten nur bei Bedarf sendet. (Nach ein wenig weiter gesucht, scheint es auch eine zu geben.)

+0

Ok danke. Der Grund, warum ich das Polling nutze, ist eigentlich, weil ich es vorläufig vermeiden möchte, aber danke für den Rat. – varatis

0

Ich glaube, Sie sollten Sie einige Kometen Technologie

http://en.wikipedia.org/wiki/Comet_(programming))

Oder eine Funktion hinzufügen, die für die durchschnittliche Antwortzeit aussehen und das Intervall dynamisch ändern. Vielleicht könnte der Server dem Kunden sagen, dass "ich viel zu tun habe, bitte warte 30 Sekunden bis zur nächsten Anfrage".