2013-01-08 12 views
16

Wenn ich das Prinzip der gesendeten Serverereignisse richtig verstehe, öffnet es jedes Mal, wenn sich ein Client bei einer EventSource registriert, eine neue HTTP-Verbindung zur Ressource, die das Ereignis verwaltet. Im Gegensatz zu anderen HTTP-Anfragen bleibt die Verbindung bestehen, so dass der Serverprozess/Thread, der diesem Client zugewiesen ist, weiterläuft, bis der Client die Verbindung trennt.Kosten für serverseitige Serverereignisse auf Serverseite

Was passiert, wenn 1000 Clients mit einer Anwendung verbunden sind, die SSE verwendet? Hätten wir 1000 Prozesse/Threads (die dasselbe tun) gleichzeitig laufen, nur um SSEs zu behandeln? Ich schätze, ich liege falsch, aber wenn nicht, ist das wirklich effizienter als die übliche AJAX-Abfragemethode, bei der zumindest der Server nicht so viele Prozesse/Threads gleichzeitig ausführen muss?

+5

Mit einem Webserver wie Apache wird es ziemlich ressourcenhungrig sein. Aber deshalb gibt es asynchrone Webserver wie node.js ... – ThiefMaster

Antwort

17

Ja, jeder Client hält die Verbindung so lange wie möglich offen. Bei 1000 gleichzeitigen Benutzern hätten Sie 1000 TCP/IP-Verbindungen geöffnet.

Ob jedoch jede Verbindung einen Thread verwendet, hängt vom Server ab.

Apache hält normalerweise einen Thread für jede Verbindung, also ist es ziemlich teuer. Bei Apache ist es am besten KeepAlive zu deaktivieren und Polling zu verwenden.

OTOH mit ereignisbasierten Servern wie node.js können Sie nur einen Prozess haben, der alle Verbindungen verwaltet, so dass die Kosten für jede Verbindung viel geringer sind und Sie Tausende von Verbindungen problemlos offen halten können.

Das Tolle an SSE ist, dass Sie damit auch Abfragen durchführen können. Es hat retry: Anweisung, die angibt, wie lange Client warten sollte, bevor erneut (Abruf) erneut. Senden Sie das einfach und schließen Sie die Verbindung, wenn Sie abfragen möchten.

+6

Danke für deine Antwort. Ok also im Grunde muss man einen ereignisgesteuerten Webserver verwenden, wenn er SSE in seiner Anwendung verwenden möchte und eine beträchtliche Anzahl von Clients erwartet. Das ist ein wichtiger Punkt, der in den Artikeln über SSE, die ich gelesen habe, fehlte. – ouno

11

Es hängt vom Threading-Modell des Servers ab. Apache standardmäßig auf einen Thread (oder Prozess) pro Verbindung, so, selbst wenn die Threads nicht sehr viel tun (wie es mit einer SSE-Verbindungen erwartet wird), sitzen sie dort mit Up-Ressourcen.

Server wie Nginx haben ein etwas anderes Modell, jeder Thread behandelt mehrere Anfragen asynchron. So etwas wie SSE und WebSockets ist viel effizienter.

Apache kann zu perform more like Nginx und ähnlichen Servern gemacht werden.

Verwandte Themen