Alternatywy dla WebSocket
Published: 2023-12-14 09:07:56

Szybki rozwój Internetu doprowadził do wzrostu zapotrzebowania na technologię czasu rzeczywistego, usprawniającą komunikację między klientami a serwerami. WebSockets zyskały na popularności i są obecnie jedną z najpopularniejszych metod umożliwiających komunikację w czasie rzeczywistym. Jednak WebSockets nie zawsze są najlepszym rozwiązaniem, ponieważ wybór technologii zależy od konkretnego przypadku użycia. Dostępnych jest wiele alternatywnych opcji, które mogą być lepiej dostosowane do konkretnych sytuacji.

Co to jest WebSocket?
---------------------

[WebSocket](https://www.pubnub.com/guides/what-are-websockets-and-when-should-you-use-them/) to protokół, który zapewnia [komunikację full-duplex](https://en.wikipedia.org/wiki/Duplex_(telecommunications)) komunikację i dwukierunkowe kanały komunikacyjne między klientami i serwerami przez Internet. Umożliwia on transmisję danych w czasie rzeczywistym pomiędzy klientem a serwerem bez konieczności ponownego łączenia się z serwerem. W przeciwieństwie do tradycyjnego [protokołu HTTP](https://www.pubnub.com/guides/http/), WebSockets umożliwiają klientowi i serwerowi inicjowanie komunikacji i wysyłanie danych w dowolnym momencie, co czyni je idealnymi do transmisji danych w czasie rzeczywistym.

![](https://images.ctfassets.net/3prze68gbwl1/7LukONcMxY3FxnW3B4xkYI/0ffd1c3ffbbbffc614155918de821e9c/WebSocket-Diagram.png)

Dlaczego warto wybrać alternatywę WebSocket?
--------------------------------------------

Prawie za każdym razem, gdy programiści myślą o komunikacji w czasie rzeczywistym, używamy WebSockets. Dlaczego tak się dzieje? Czy są one jedynym/najlepszym wyborem do osiągnięcia transmisji w czasie rzeczywistym, bez względu na przypadek użycia?

Mówiąc prościej, WebSockets zapewniają zaawansowane funkcje, ale w zależności od przypadku użycia mogą mieć wiele wad, które mogą szybko zwiększyć złożoność projektu. Aby to rozwiązać, zastanówmy się, dlaczego programiści wybraliby alternatywę WebSocket.

Wydajność: WebSockets są najbardziej znane ze swojej zaawansowanej funkcjonalności, ale czasami mogą stanowić przesadne rozwiązanie i prowadzić do niskiej wydajności. Decydując się na korzystanie z WebSockets, należy wziąć pod uwagę przypadek użycia. Na przykład, istnieją lepsze rozwiązania niż WebSockets, jeśli potrzebujesz wysokiej współbieżności połączeń. Połączenia WebSocket muszą pozostać żywe między klientem a serwerem, co prowadzi do zwiększonego obciążenia serwera i podstawowej infrastruktury w miarę skalowania.

Interoperacyjność: WebSockets są obsługiwane przez wszystkie nowoczesne przeglądarki/sieci internetowe. Przypadkowo, jeśli oprogramowanie jest używane w starszej przeglądarce lub sieci, ważne jest, aby rozważyć, czy WebSockets ma wsparcie w tym starszym systemie. Ponadto sieci i serwery proxy czasami całkowicie blokują połączenia WebSocket, więc miejsce korzystania z oprogramowania jest kolejnym czynnikiem, który należy wziąć pod uwagę.

Bezpieczeństwo: WebSockets nie są bezpieczne jak niektóre alternatywy i mają luki, które mogą wykorzystać złośliwi aktorzy. Niektóre powody, dla których WebSockets są uważane za mniej bezpieczne niż inne protokoły, obejmują przechwytywanie między witrynami WebSocket i fałszowanie pochodzenia.

Alternatywy dla WebSocket
-------------------------

#### Długie odpytywanie

[Długie odpytywanie](https://www.pubnub.com/guides/long-polling/) to podejście, w którym klient wysyła żądanie HTTP/HTTPS do serwera, ale zamiast otrzymywać natychmiastową odpowiedź od serwera, pociąga za sobą utrzymanie połączenia HTTP. Utrzymywanie połączenia HTTP pozwala serwerowi odpowiedzieć później, gdy dane staną się dostępne lub zostanie osiągnięty próg limitu czasu. Po otrzymaniu odpowiedzi klient natychmiast wyśle kolejne żądanie.

Długie odpytywanie umożliwia komunikację w czasie rzeczywistym bez dwukierunkowych kanałów komunikacyjnych, które zapewniają WebSockets. Podstawowa różnica polega na tym, że zamiast utrzymywać trwałe połączenie, jak w przypadku WebSockets, klient wysyła wiele żądań w celu ponownego nawiązania połączenia z serwerem.

![](https://images.ctfassets.net/3prze68gbwl1/2FEB0j6VRCXSe28P5ruiSZ/a149b8fdbbdb77e5f3bb81aab9902dac/HTTP_Long_Polling.png)

#### MQTT

[MQTT](https://www.pubnub.com/guides/mqtt/) to lekki protokół sieciowy typu [publikuj-subskrybuj](https://www.pubnub.com/guides/everything-you-need-to-know-about-pub-sub/), typu maszyna-maszyna, przeznaczony do zdalnych lokalizacji z urządzeniami o ograniczonej przepustowości sieci. Inteligentne czujniki, urządzenia do noszenia i inne urządzenia IoT zazwyczaj muszą korzystać z takiego protokołu ze względu na ograniczenia zasobów. Podczas gdy WebSockets może być używany do różnych zastosowań, MQTT jest wyraźnie zaprojektowany do komunikacji maszyna-maszyna, dlatego jest uważany za alternatywę w tych przypadkach użycia. MQTT zapewnia takie funkcje, jak niski narzut, wydajne dostarczanie wiadomości i obsługa pracy w trybie offline.

![](https://images.ctfassets.net/3prze68gbwl1/2R4S3y5yDtT3r91DvpbI8t/2df1e001799058ec32cadd3a887a8fbd/MQTT_Glossary_Broker_copy_4.png)

#### WebRTC

[WebRTC](https://www.pubnub.com/guides/webrtc/) to darmowy projekt open-source napisany w [C++](https://www.pubnub.com/docs/sdks/posix-cpp) i [JavaScript](https://www.pubnub.com/docs/sdks/javascript), który zapewnia przeglądarkom internetowym i urządzeniom mobilnym komunikację w czasie rzeczywistym. WebRTC jest [zbudowany](https://dolby.io/blog/adding-pubnub-in-app-chat-to-your-webrtc-live-stream-app/) do przesyłania strumieniowego audio i wideo bezpośrednio z sieci peer-to-peer bez konieczności korzystania z połączeń po stronie serwera lub dodatkowych wtyczek. W przypadku przypadków użycia, takich jak transmisje strumieniowe na żywo, wideokonferencje lub połączenia grupowe, funkcje te można szybko zaprojektować za pomocą HTML5 i [JavaScript](https://www.pubnub.com/guides/javascript/) przy użyciu interfejsu API WebRTC. Podsumowując, natura peer-to-peer WebRTC może pomóc zmniejszyć obciążenie serwera i zapewnić bardziej wydajną i wysokiej jakości komunikację w porównaniu do WebSockets w tych przypadkach użycia.

### WebTransport vs WebSocket

[WebTransport](https://www.pubnub.com/guides/webtransport/) to nowy protokół komunikacji internetowej, który zapewnia połączenie o niskim opóźnieniu i wysokiej przepustowości między klientem a serwerem. Został on stworzony w celu rozwiązania niektórych ograniczeń tradycyjnych protokołów, takich jak WebSockets, i zapewnienia nowoczesnej alternatywy, która może lepiej sprostać wymaganiom dzisiejszych aplikacji internetowych.

Podczas gdy WebSockets zazwyczaj rozpoczyna się jako żądanie HTTP/1.1 Upgrade, WebTransport obsługuje wiele protokołów, w tym HTTP/2, [HTTP/3](https://en.wikipedia.org/wiki/HTTP/3)i [QUIC](https://en.wikipedia.org/wiki/QUIC)i jest transportem [opartym na UDP](https://www.pubnub.com/guides/udp/). Ponadto WebTransport obsługuje niezawodne wysyłanie danych za pośrednictwem interfejsu API strumieni i niewiarygodne za pośrednictwem interfejsu API datagramów. Jak ta nowa technologia wypada w porównaniu do WebSockets i jakie są zalety przejścia na protokół WebTransport?

Zaawansowana funkcjonalność: Wyzwaniem związanym z WebSockets jest to, że wysyłanie różnych typów danych, takich jak obraz i tekst, za pośrednictwem jednego połączenia może być trudne. Problem pojawia się, ponieważ dane są dzielone na mniejsze jednostki, znane jako pakiety, w celu transmisji przez połączenie [TCP](https://www.pubnub.com/guides/tcp-ip/). Podczas dzielenia danych na pakiety nie ma możliwości rozróżnienia między zwykłym tekstem a zakodowanym obrazem zawartym w danych. Aby rozwiązać ten problem, WebSockets często muszą tworzyć dwa oddzielne połączenia między serwerem a klientem, jedno dla obrazów, a drugie dla tekstu. WebTransport zapewnia jednak rozwiązanie poprzez obsługę wielu strumieni, znanych jako multipleksowanie. Obsługując wiele strumieni, programiści mogą wysyłać różne typy danych za pośrednictwem jednego połączenia, zmniejszając obciążenie związane z nawiązywaniem i utrzymywaniem wielu połączeń. Staje się to niezbędne, gdy serwer musi obsługiwać wielu klientów. Wiele połączeń na klienta, jak w WebSockets, może prowadzić do złożoności, gdy serwer zaczyna się skalować.

Lepsza wydajność: WebTransport jest protokołem transportowym opartym na UDP, bardziej wydajnym niż protokoły oparte na TCP, takie jak WebSockets. Ze względu na to, że jest oparty na UDP, nie ma korekcji błędów ani retransmisji. Korekcja błędów odnosi się do wykrywania i korygowania błędów, które mogą wystąpić w przesyłanych danych. Retransmisja odnosi się do przetwarzania ponownego wysyłania utraconych lub uszkodzonych pakietów danych przez sieć. Ze względu na brak narzutu korekcji i retransmisji, obniża to [opóźnienia](https://www.pubnub.com/guides/whats-so-important-about-low-latency/) WebTransport. WebTransport oferuje również konfigurację WebTransportCongestionControl, która może zoptymalizować przepustowość i opóźnienie żądań. Po drugie, nawiązanie nowego połączenia z WebTransport przez QUIC handshake jest zazwyczaj szybsze niż TCP przez TLS.

Niezawodność: Brak korekcji błędów i retransmisji może sprawić, że programista pomyśli, że WebTransport jest mniej niezawodny niż WebSockets. Tak nie jest; WebTransport, z założenia, zapewnia większą niezawodność niż WebSockets, szczególnie w scenariuszach z komunikacją o dużej przepustowości i trudnych warunkach sieciowych. WebTransport [zapewnia](https://www.w3.org/TR/webtransport/) API strumieni dla niezawodnego jednokierunkowego (WebTransportReceiveStreams) lub dwukierunkowego dwukierunkowego (WebTransportBidirectionalStream) transferu danych. Ten punkt końcowy interfejsu API oferuje konfiguracje, takie jak WebTransportReliabilityMode, które mogą umożliwić połączenie awaryjne TCP w scenariuszach, w których niezbędny jest niezawodny transfer danych.

Bezpieczeństwo: WebTransport oferuje bezpieczniejszy protokół niż WebSockets. Domyślnie zapewnia szyfrowanie end-to-end, co gwarantuje, że dane między klientem a serwerem nie mogą zostać przechwycone ani zmodyfikowane podczas przesyłania. Jedną z tych funkcji bezpieczeństwa jest użycie nagłówka "Origin", który zapewnia serwerowi sposób weryfikacji, czy żądania pochodzą z zaufanego źródła. Pomaga to zapobiegać atakom typu cross-site request forgery (CSRF).

### Inne alternatywy

#### Zdarzenia wysyłane przez serwer

[Server-Sent Events (SSE)](https://www.pubnub.com/guides/server-sent-events/) to technologia server push, która umożliwia serwerowi przesyłanie danych do klienta za pośrednictwem pojedynczego połączenia HTTP. SSE to prosty, wydajny protokół do wysyłania aktualizacji w czasie rzeczywistym do strony internetowej lub aplikacji, dzięki czemu dobrze nadaje się do określonych przypadków użycia. W przeciwieństwie do tradycyjnych żądań HTTP, które zamykają połączenie po pojedynczej odpowiedzi, SSE otwiera długotrwałe połączenie między serwerem a klientem, umożliwiając serwerowi wysyłanie wielu aktualizacji za pośrednictwem tego samego połączenia. W porównaniu do dwukierunkowych połączeń WebSockets, zdarzenia wysyłane przez serwer są tylko jednokierunkowe. Klient musi jedynie zainicjować połączenie i je zamknąć. Jednak ograniczony zestaw funkcji Server-Sent Events ułatwia ich implementację i debugowanie. Zdarzenia wysyłane przez serwer były początkiem [EventSource](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) API, który ułatwia implementację w przeglądarkach internetowych.

![Server Sent Events exchange](https://images.ctfassets.net/3prze68gbwl1/7hGVCgK5DEFPKeakTFWKxu/7462285d9e144607b97f93a58d82a609/Server-Sent.png)

Jak PubNub może pomóc z alternatywami WebSocket
-----------------------------------------------

Protokół WebSocket i jego alternatywy, takie jak WebTransport, są cennymi rozwiązaniami do obsługi komunikacji w czasie rzeczywistym. Jednak bez względu na to, jakie rozwiązanie zostanie wybrane, czas zostanie zmarnowany na wdrożenie podstawowej infrastruktury i złożoności podczas skalowania. Przykładowo, w przypadku korzystania z określonych technologii, takich jak [Socket.io](https://www.pubnub.com/guides/what-is-socket-io/) do tworzenia serwera WebSocket, programiści nadal będą musieli dbać o dynamiczne odradzanie serwerów na całym świecie za load balancerem, aby zarządzać wykorzystaniem każdego serwera WWW.

[Interfejsy API](https://www.pubnub.com/learn/glossary/what-is-real-time-data/) PubNub do obsługi [danych w czasie rzeczywistym](https://www.pubnub.com/learn/glossary/what-is-real-time-data/) umożliwiają użytkownikom tworzenie potężnych, sterowanych zdarzeniami aplikacji ułatwiających komunikację w czasie rzeczywistym na wszystkich urządzeniach, niezależnie od konkretnego przypadku użycia. PubNub oferuje różne zestawy SDK, takie jak [JavaScript SDK](https://www.pubnub.com/docs/sdks/javascript) dla aplikacji internetowych i [C-Core SDK](https://www.pubnub.com/docs/sdks/c-core) dla aplikacji IoT, aby zapewnić płynną integrację z wybranym urządzeniem. Dzięki PubNub nie musisz martwić się o wybór odpowiedniej alternatywy lub złożoność implementacji rozwiązania czasu rzeczywistego.

Teraz już wiesz, kiedy użyć WebSockets lub alternatywy, [zarejestruj się na darmowy okres próbny](https://admin.pubnub.com/#/register) lub [zaplanuj demo](https://www.pubnub.com/company/contact-sales/) aby dowiedzieć się, co można zbudować za pomocą PubNub.

Jak PubNub może ci pomóc?
=========================

Ten artykuł został pierwotnie opublikowany na PubNub [.com](https://pubnub.com/blog/websockets-alternatives/)

Nasza platforma pomaga programistom tworzyć, dostarczać i zarządzać interaktywnością w czasie rzeczywistym dla aplikacji internetowych, aplikacji mobilnych i urządzeń IoT.

Podstawą naszej platformy jest największa w branży i najbardziej skalowalna sieć komunikacyjna w czasie rzeczywistym. Dzięki ponad 15 punktom obecności na całym świecie obsługującym 800 milionów aktywnych użytkowników miesięcznie i niezawodności na poziomie 99,999%, nigdy nie będziesz musiał martwić się o przestoje, limity współbieżności lub jakiekolwiek opóźnienia spowodowane skokami ruchu.

Poznaj PubNub
-------------

Sprawdź [Live Tour](https://www.pubnub.com/tour/introduction/), aby zrozumieć podstawowe koncepcje każdej aplikacji opartej na PubNub w mniej niż 5 minut.

Rozpocznij konfigurację
-----------------------

Załóż [konto](https://admin.pubnub.com/signup/) PubNub, aby uzyskać natychmiastowy i bezpłatny dostęp do kluczy PubNub.

Rozpocznij
----------

[Dokumenty](https://www.pubnub.com/docs) PubNub pozwolą Ci rozpocząć pracę, niezależnie od przypadku użycia lub [zestawu SDK](https://www.pubnub.com/docs).