Vom Server gesendete Ereignisse im Vergleich zum Abruf
Gibt es einen großen Unterschied (in Bezug auf Leistung, browser-Implementierung Verfügbarkeit, server-load etc.) zwischen HTML5-SSEs und gerade Ajax-polling? Von der server-Seite, wie es scheint, eine EventSource
ist nur schlagen Sie die angegebene Seite alle ~3 Sekunden oder so (obwohl ich verstehen, der Zeitpunkt ist flexibel).
Zugegeben, es ist einfacher einzurichten, auf der client-Seite als das einrichten einer Zeitschaltuhr und dass es $.get
jeder so oft, aber gibt es sonst noch etwas? Es tut senden weniger Kopfzeilen, oder einige andere Magie fehlt mir?
InformationsquelleAutor der Frage Inaimathi | 2012-02-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ajax-polling-fügt eine Menge von HTTP-overhead, da Sie ständig Aufbau-und Abbau von HTTP-verbindungen. Als HTML5 Rocks bringt es "Server-Sent-Events auf der anderen Seite, sind entworfen worden, von Grund auf effizient zu sein."
Server-sent events öffnen Sie eine einzelne langlebige HTTP-Verbindung. Der server bzw Daten sendet, wenn es ist, gibt es keine Notwendigkeit für die client-Anfrage oder nichts tun, sondern warten, für Nachrichten.
Einzige Nachteil, Server-sent events ist, dass seit Sie erstellen eine permanente Verbindung zu dem server, den Sie haben könnten zu vielen offenen verbindungen zu Ihrem server. Einige Server Griff eine enorme Anzahl von gleichzeitigen verbindungen besser als andere. Das sagte, Sie hätte ähnliche Probleme mit der polling-plus den Aufwand der ständig wieder herstellt, die verbindungen.
Server-sent events sind ganz gut in den meisten Browsern unterstütztdie Bemerkenswerte Ausnahme ist natürlich, DH. Aber es gibt eine paar von polyfills (und ein jQuery-plugin) , wird das beheben.
Wenn Sie etwas, das nur noch one-way-Kommunikation ist, würde ich auf jeden Fall gehen mit Server-sent events. Wie Sie schon erwähnten, Server-sent-events neigen dazu, einfacher und sauberer zu implementieren, die auf der client-Seite. Sie müssen nur zum einrichten der Listener für Nachrichten und Veranstaltungen, und der browser kümmert sich um low-level-Sachen wie reconnect wenn disconnected, etc. Auf der server-Seite ist es auch Recht einfach zu implementieren, da es nur mit einfachen text. Wenn Sie Sie senden, JSON codierte Objekte können Sie ganz einfach schalten Sie Sie in JavaScript-Objekte auf dem client über
JSON.parse()
.Wenn Sie mit PHP auf dem server, die Sie verwenden können,
die Funktionen json_encode()
zu drehen, strings, zahlen, arrays und Objekte in codierter JSON. Andere back-end-Sprachen können auch bieten ähnliche Funktionen.InformationsquelleAutor der Antwort Useless Code
Ich würde nur hinzufügen, eine höhere Sicht auf das, was gesagt worden ist, und das ist, dass die SSE ist publish-subscribe-Modell im Gegensatz zu ständige polling im Falle von AJAX.
Grundsätzlich beide Wege (polling und publish-subscribe) werden versuchen das problem zu lösen, wie die Aufrechterhaltung eines up-to-date-Status auf dem client.
1) Polling-Modell
Ist es einfach. Der client (browser) ruft zunächst einen Anfangszustand (Seite) und für Sie zu aktualisieren, muss es in regelmäßigen Abständen Anfrage der Staat (die Seite oder Teile davon) und verarbeiten das Ergebnis in den aktuellen Zustand (refresh ganze Seite zu machen oder es inteligently in seinen Teil bei AJAX).
Natürlich ein Nachteil ist, dass wenn nichts passiert mit dem server-Zustand der Ressourcen (CPU, Netzwerk, ...) verwendet werden, unnötig. Ein weiterer ist, dass selbst wenn sich der Zustand ändert den Kunden bekommt es nur bei der nächsten Umfrage-Zeitraum, nicht so schnell wie möglich. Eine oft zu bewerten, muss eine gute Zeit Kompromiss zwischen den beiden Dingen.
Weiteres Beispiel von polling ist eine spinwait in threading.
2) Publish-subscribe-Modell
Funktioniert es wie folgt:
Dies ist SSE, oder innerhalb threading eine wartemöglichkeit Ereignis, als ein weiteres Beispiel.
Ein natürlicher Nachteil, wie gesagt, ist, dass der server wissen muss, über alle seine abonnierten clients, die je nach Implementierung kann ein Problem sein.
InformationsquelleAutor der Antwort Richard