2013-01-08 10 views
16

Jeśli dobrze rozumiem zasadę dotyczącą zdarzeń wysyłanych przez serwer, za każdym razem, gdy klient rejestruje się w źródle zdarzenia, faktycznie otwiera ono nowe połączenie HTTP z zasobem zarządzającym zdarzeniem. W przeciwieństwie do innych żądań HTTP połączenie pozostaje aktywne, dlatego proces/wątek serwera dedykowany dla tego klienta działa, dopóki klient się nie rozłączy.Koszt zdarzeń wysłanych przez serwer po stronie serwera

Co się stanie, jeśli 1000 klientów zostanie podłączonych do aplikacji za pomocą SSE? Czy mamy 1000 procesów/wątków (robiących to samo) działających równolegle tylko po to, aby obsłużyć SSE? Sądzę, że jestem w błędzie, ale jeśli nie jestem, czy jest to naprawdę bardziej wydajne niż zwykła metoda odpytywania AJAX, w której przynajmniej serwer nie musi jednocześnie uruchamiać tylu procesów/wątków?

+5

Dzięki serwerowi internetowemu, takim jak Apache, będzie dość zasobożerny. Ale właśnie dlatego istnieją takie asyncowe serwery, jak node.js ... – ThiefMaster

Odpowiedz

17

Tak, każdy klient utrzymuje połączenie otwarte tak długo, jak tylko może. Z 1000 równoczesnymi użytkownikami otworzysz 1000 połączeń TCP/IP.

Jednak to, czy każde połączenie korzysta z wątku, zależy od serwera.

Apache zwykle utrzymuje wątek uruchomiony dla każdego połączenia, więc jest dość drogi. Z Apache najlepiej wyłączyć KeepAlive i używać odpytywania.

OTOH z serwerami opartymi na zdarzeniach, takimi jak node.js, może mieć tylko jeden proces, który zarządza wszystkimi połączeniami, więc koszt każdego połączenia jest znacznie niższy i powinieneś mieć możliwość łatwego otwierania tysięcy połączeń.

Fajną rzeczą związaną z SSE jest to, że można jej używać do przeprowadzania ankiet. Ma dyrektywę retry:, która określa, jak długo klient powinien czekać ponownie przed ponownym połączeniem (odpytywaniem). Po prostu wyślij i zamknij połączenie, gdy chcesz przeprowadzić polling.

+6

Dziękuję za odpowiedź. Ok, więc w zasadzie trzeba użyć serwera WWW sterowanego zdarzeniami, jeśli planuje użyć SSE w swojej aplikacji i oczekuje znacznej liczby klientów. To jest ważny punkt, którego brakowało w artykułach o SSE, które przeczytałem. – ouno

11

To zależy od modelu wątków serwera. Apache domyślnie jest ustawiony na jeden wątek (lub proces) na połączenie, więc nawet jeśli wątki nie robią zbyt wiele (jak można się spodziewać przy połączeniach SSE), to oni siedzą tam, wykorzystując zasoby.

Serwery takie jak Nginx mają nieco inny model, każdy wątek obsługuje asynchronicznie wiele żądań. Rzeczy takie jak SSE i WebSockets są znacznie wydajniejsze.

Apache można wykonać na perform more like Nginx i podobnych serwerach.

Powiązane problemy