Zdarzenia wysłane przez serwer vs ankiety

Czy istnieje duża różnica (pod względem wydajności, dostępności implementacji przeglądarki, obciążenia serwera itp.) między SSSE HTML5 A prostym ankietowaniem Ajax? Od strony serwera wygląda na to, że EventSource po prostu uderza w określoną stronę co ~3 sekundy lub tak (chociaż rozumiem, że czas jest elastyczny).

Przyznaję, łatwiej jest skonfigurować po stronie klienta niż ustawić timer i mieć go co jakiś czas $.get, ale czy jest coś jeszcze? Czy wysyła mniej nagłówki, czy zrobić jakąś inną magię, której mi brakuje?

Author: Wil Moore III, 2012-02-22

2 answers

Ajax polling dodaje wiele narzutu HTTP, ponieważ stale ustanawia i zrywa połączenia HTTP. Jak to ujął HTML5 Rocks "zdarzenia wysłane przez serwer zostały zaprojektowane od podstaw tak, aby były wydajne."

Zdarzenia wysłane przez serwer otwierają pojedyncze długotrwałe połączenie HTTP. Następnie serwer wysyła dane jednokierunkowo, gdy je posiada, nie ma potrzeby, aby Klient żądał ich lub robił cokolwiek, ale czekał na wiadomości.

Jeden minus do zdarzeń wysłanych przez serwer polega na tym, że ponieważ tworzą trwałe połączenie z serwerem, potencjalnie możesz mieć wiele otwartych połączeń z serwerem. Niektóre serwery obsługują ogromną liczbę jednoczesnych połączeń lepiej niż inne. To powiedziawszy, miałbyś podobne problemy z sondażami plus koszty ciągłego przywracania tych połączeń.

Zdarzenia wysyłane przez serwer są dość dobrze obsługiwane w większości przeglądarek , zauważalnym wyjątkiem jest oczywiście IE. Ale istnieje para z polyfills (i jQuery plugin), które to naprawią.

Jeśli robisz coś, co wymaga tylko jednokierunkowej komunikacji, zdecydowanie wybrałbym zdarzenia wysłane przez serwer. Jak wspomnieliście, zdarzenia wysyłane przez serwer wydają się być prostsze i czystsze w implementacji po stronie klienta. Wystarczy skonfigurować słuchaczy dla wiadomości i zdarzeń, a przeglądarka zajmuje się niskopoziomowymi rzeczami, takimi jak ponowne łączenie w przypadku rozłączenia itp. Po stronie serwera to jest również dość łatwy do wdrożenia, ponieważ używa tylko prostego tekstu. Jeśli wyślesz obiekty zakodowane w JSON, możesz łatwo przekształcić je w Obiekty JavaScript na kliencie za pomocą JSON.parse().

Jeśli używasz PHP na serwerze możesz użyć json_encode() przekształcanie łańcuchów, liczb, tablic i obiektów w odpowiednio zakodowany JSON. Inne języki zaplecza mogą również zapewniać podobne funkcje.

 70
Author: Useless Code,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-03 09:12:55

Dodałbym tylko wyższą perspektywę do tego, co zostało powiedziane, a mianowicie, że SSE jest modelem publish-subscribe w przeciwieństwie do ciągłego sondowania w przypadku AJAX.

Ogólnie rzecz biorąc, oba sposoby (ankieta i publish-subscribe) próbują rozwiązać problem, jak utrzymać aktualny stan na kliencie.

1) Wzór ankiety

To proste. Klient (przeglądarka) najpierw otrzymuje stan początkowy (strona) i aby go zaktualizować, musi okresowo żądać stanu (strona lub jej część) i przetworzyć wynik do bieżącego stanu (odświeżyć całą stronę lub renderować ją inteligentnie do jej części w przypadku AJAX).

Oczywiście jedną z wad jest to, że jeśli nic się nie stanie z serwerem stan zasobów (CPU, sieci, ...) są wykorzystywane niepotrzebnie. Innym jest to, że nawet jeśli stan się zmieni, klienci otrzymują go dopiero w następnym okresie ankiety, a nie JAK NAJSZYBCIEJ. Często trzeba ocenić dobry kompromis czasowy między tymi dwoma rzeczami.

Kolejny przykład sondażu jest spinwait w gwintowaniu.

2) Publikuj-Subskrybuj model

To działa w następujący sposób:

  • (klient najpierw żąda i pokazuje jakiÅ› stan poczÄ…tkowy)
  • Klient subskrybuje serwer (wysyÅ‚a jedno żądanie, ewentualnie z jakimÅ› kontekstem, np. źródÅ‚em zdarzenia) Serwer oznacza odniesienie do Klienta do jakiegoÅ› repozytorium referencji klienta.]}
  • W przypadku aktualizacji stanu, serwer wysyÅ‚a powiadomienie do klienta na podstawie odniesienia do klienta nie jest to odpowiedź na żądanie, ale wiadomość zainicjowana przez Serwer
  • Dobry klient rezygnuje z subskrypcji, gdy nie jest już zainteresowany powiadomieniami]}

Jest to SSE, lub w wątku zdarzenia waitable, jako inny przykład. Naturalną wadą, jak wspomniano, jest to, że serwer musi wiedzieć o wszystkich swoich subskrybowanych klientach, co w zależności od implementacji może być problemem.

 3
Author: Richard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 10:58:14