Zarówno Websockets, jak i SSE (Server Sent Events) są w stanie przesyłać dane do przeglądarek, jednak nie są to konkurencyjne technologie.
Połączenia Websockets mogą zarówno wysyłać dane do przeglądarki, jak i odbierać dane z przeglądarki. Dobrym przykładem aplikacji, która mogłaby korzystać z websockets, jest aplikacja do czatu.
Połączenia SSE mogą przekazywać dane tylko do przeglądarki. Notowania giełdowe online lub Twitter aktualizujący oś czasu lub kanał to dobre przykłady aplikacji, która mogłaby skorzystać z SSE.
W praktyce, ponieważ wszystko, co można zrobić za pomocą SSE, można również zrobić za pomocą Websockets, Websockets zyskuje o wiele więcej uwagi i miłości, a wiele innych przeglądarek obsługuje Websockets niż SSE.
Jednak w przypadku niektórych typów aplikacji może to być nadmiar, a backend może być łatwiejszy do wdrożenia przy pomocy protokołu takiego jak SSE.
Ponadto SSE może być wypełniane w starszych przeglądarkach, które nie obsługują go natywnie za pomocą samego JavaScript. Niektóre implementacje wypełnień SSE można znaleźć na stronie github Modernizr .
Gotchas:
- SSE cierpi z powodu ograniczenia maksymalnej liczby otwartych połączeń, co może być szczególnie bolesne przy otwieraniu różnych kart, ponieważ limit dotyczy przeglądarki i jest ustawiony na bardzo niską liczbę (6). Problem został oznaczony jako „Nie naprawi” w Chrome i Firefox . Limit ten dotyczy przeglądarki + domeny, co oznacza, że możesz otworzyć 6 połączeń SSE na wszystkich kartach
www.example1.com
i kolejne 6 połączeń SSE do www.example2.com
(dzięki Phate).
- Tylko WS może przesyłać zarówno dane binarne, jak i UTF-8, SSE jest ograniczone do UTF-8. (Dzięki Chado Nihi).
- Niektóre zapory ogniowe z inspekcją pakietów mają problemy z obsługą WebSockets (Sophos XG Firewall, WatchGuard, McAfee Web Gateway).
HTML5Rocks ma kilka dobrych informacji na temat SSE. Z tej strony:
Zdarzenia wysłane przez serwer a WebSockets
Dlaczego wybrałeś zdarzenia wysyłane przez serwer zamiast WebSockets? Dobre pytanie.
Jednym z powodów, dla których SSE były trzymane w cieniu, jest fakt, że późniejsze interfejsy API, takie jak WebSockets, zapewniają bogatszy protokół umożliwiający dwukierunkową komunikację w pełnym dupleksie. Posiadanie dwukierunkowego kanału jest bardziej atrakcyjne w przypadku gier, aplikacji do przesyłania wiadomości oraz przypadków, w których potrzebujesz aktualizacji w czasie rzeczywistym w obu kierunkach. Jednak w niektórych scenariuszach dane nie muszą być wysyłane od klienta. Potrzebujesz tylko aktualizacji z niektórych działań serwera. Kilka przykładów to aktualizacje statusu znajomych, notowania giełdowe, kanały informacyjne lub inne automatyczne mechanizmy wypychania danych (np. Aktualizacja bazy danych SQL Web po stronie klienta lub składnicy obiektów IndexedDB). Jeśli będziesz musiał wysłać dane do serwera, XMLHttpRequest jest zawsze przyjacielem.
SSE są przesyłane tradycyjnym HTTP. Oznacza to, że do działania nie wymagają specjalnego protokołu ani implementacji serwera. Z drugiej strony WebSockets wymagają połączenia pełnego dupleksu i nowych serwerów Web Socket do obsługi protokołu. Ponadto zdarzenia wysyłane przez serwer mają wiele funkcji, których WebSockets brakuje z założenia, takich jak automatyczne ponowne łączenie, identyfikatory zdarzeń i możliwość wysyłania dowolnych zdarzeń.
Podsumowanie TLDR:
Zalety SSE nad Websockets:
- Transportowany przez prosty HTTP zamiast niestandardowego protokołu
- Może być wielokrotnie wypełniany javascript do „backportowania” SSE do przeglądarek, które jeszcze go nie obsługują.
- Wbudowana obsługa ponownego połączenia i identyfikatora zdarzenia
- Prostszy protokół
- Nie ma problemu z korporacyjnymi zaporami ogniowymi wykonującymi kontrolę pakietów
Zalety Websockets nad SSE:
- Komunikacja w czasie rzeczywistym, dwukierunkowa.
- Natywne wsparcie w większej liczbie przeglądarek
Idealne przypadki użycia SSE:
- Akcje giełdowe giełdowe
- aktualizacja kanału Twitter
- Powiadomienia dla przeglądarki
Gotówki SSE:
- Brak wsparcia binarnego
- Maksymalny limit otwartych połączeń