Czy zdarzyło Ci się dodać produkt do koszyka, po czym odświeżyć stronę, by zobaczyć nową liczbę? A może podczas wyprzedaży widziałeś komunikat „ostatnia sztuka”, ale po dodaniu okazywało się, że towar już się wyprzedał? To nie są odosobnione przypadki – to codzienność e-commerce opartego na architekturze request-response. Rozwiązaniem, które eliminuje te frustracje, jest WebSocket – protokół umożliwiający komunikację dwukierunkową w czasie rzeczywistym. Ale uwaga: wdrożenie go na oślep może przynieść więcej szkody niż pożytku. W tym artykule pokażę trzy najczęstsze błędy we wdrażaniu WebSocket w e-commerce i podpowiem, jak je naprawić, by zyskać przewagę konkurencyjną.
Czym jest WebSocket i dlaczego ma znaczenie w e-commerce?
WebSocket to protokół komunikacyjny, który utrzymuje stałe połączenie między przeglądarką a serwerem. W przeciwieństwie do klasycznego HTTP, gdzie każda interakcja wymaga nowego żądania i odpowiedzi, WebSocket pozwala serwerowi na wysyłanie danych w dowolnym momencie bez inicjatywy klienta. Dla sklepu internetowego oznacza to natychmiastowe aktualizacje: zmiana stanu magazynowego, nowa cena w koszyku, czy powiadomienie o dostępności produktu – wszystko bez przeładowania strony.
Korzyści są oczywiste: poprawa UX, większa sprzedaż i mniej porzuconych koszyków. Jednak WebSocket ma też ciemną stronę – jeśli wdrożymy go bez przemyślenia, możemy narazić się na problemy z wydajnością, bezpieczeństwem i kosztami. Oto trzy najczęstsze błędy, które widzę u klientów.
Błąd 1: WebSocket do wszystkiego – czyli gdy narzędzie staje się celem
Pierwszy błąd to traktowanie WebSocket jako srebrnej kuli na wszystkie problemy z wydajnością. Nie każda funkcja w e-commerce potrzebuje komunikacji w czasie rzeczywistym. Przykład: aktualizacja listy produktów po zmianie kategorii. To typowa operacja, którą bez problemu obsłuży klasyczne żądanie HTTP – użytkownik i tak musi kliknąć, by przejść do innej kategorii. Użycie WebSocket w tym miejscu to marnowanie zasobów: każde połączenie utrzymuje otwarty socket, co przy tysiącach użytkowników generuje ogromne obciążenie serwera.
Konsekwencje: wzrost kosztów infrastruktury i spadek ogólnej wydajności, bo serwer musi obsługiwać niepotrzebne połączenia. Zamiast tego, WebSocket warto zarezerwować dla funkcji, które naprawdę tego wymagają: powiadomienia o stanie zamówienia, żywy podgląd koszyka na wielu urządzeniach, wspólna edycja listy zakupów, czy aukcje na żywo.
Jak to naprawić? Przeprowadź audyt funkcjonalności sklepu i zidentyfikuj te, które wymagają natychmiastowej aktualizacji danych. Dla pozostałych zostań przy HTTP, a jeśli już musisz użyć WebSocket – rozważ subskrypcję tematyczną (np. tylko dla zalogowanych użytkowników w trakcie sesji zakupowej).
Błąd 2: Zaniedbanie bezpieczeństwa WebSocket
Drugi błąd to traktowanie WebSocket jako „bezpiecznego” tylko dlatego, że działa na tym samym porcie co HTTPS. To złudzenie. WebSocket nie sprawdza automatycznie tożsamości użytkownika – jeśli nie zabezpieczysz połączenia, każdy może podsłuchiwać lub wysyłać fałszywe dane. Wyobraź sobie, że ktoś podmienia dane o cenie w koszyku lub wywołuje fałszywe powiadomienia o dostępności – chaos gotowy.
Najczęstsze luki:
- Brak autoryzacji przy ustanawianiu połączenia – każdy może podłączyć się do gniazda i zacząć odbierać dane.
- Wysyłanie wrażliwych danych (np. tokenów sesji) przez WebSocket w jawnej formie.
- Brak mechanizmu weryfikacji integralności wiadomości.
Jak to naprawić? Zawsze używaj WebSocket przez TLS (wss://). Autoryzuj połączenie, wysyłając token JWT w nagłówku podczas handshake. Na serwerze sprawdzaj, czy dane przychodzące są zgodne z oczekiwanym formatem i nie naruszają reguł biznesowych. Nigdy nie ufaj danym z WebSocket – traktuj je jak każde inne wejście użytkownika.
Błąd 3: Brak strategii na utratę połączenia
Trzeci, wyjątkowo bolesny błąd, to zakładanie, że połączenie WebSocket będzie zawsze stabilne. W realnym świecie sieć bywa kapryśna: użytkownik przechodzi między sieciami Wi-Fi, wchodzi do windy, wyłącza telefon. Jeśli aplikacja nie radzi sobie z przerwaniem połączenia, użytkownik zobaczy przestarzałe dane, a nawet może stracić koszyk.
Klasyczny przykład: Klient przegląda sklep w metrze, dodaje produkt do koszyka (WebSocket aktualizuje ikonę koszyka na 1), po czym traci zasięg. WebSocket urywa się. Po chwili sygnał wraca – strona ładuje się od nowa (bo np. SPA nie odświeżyło danych) i koszyk jest pusty. Klient wściekły, a transakcja stracona.
Jak to naprawić? Zaimplementuj mechanizm automatycznego ponownego łączenia z wykładniczym backoffem (np. próby co 1s, 2s, 4s, 8s). Zapisz stan koszyka w localStorage lub IndexedDB, aby po przerwaniu i ponownym połączeniu przywrócić go z lokalnej pamięci. Na serwerze przechowuj sesję WebSocket i po ponownym połączeniu wysyłaj pełen stan aktualny (np. lista przedmiotów w koszyku). Możesz też użyć heartbeat (ping-pong), aby szybko wykrywać utratę połączenia.
WebSocket a skalowalność – czego nie mówią na kursach
Wdrożenie WebSocket na małym sklepie to prosta sprawa, ale przy większym ruchu trzeba pomyśleć o skalowaniu. Każde połączenie zajmuje pamięć na serwerze – jeśli używasz jednej instancji aplikacji, przy 10 000 równoczesnych użytkowników możesz jej przeciążyć. Rozwiązanie? Użyj menedżera stanu WebSocket (np. Redis Pub/Sub) i skaluj horyzontalnie. Każda instancja serwera subskrybuje kanały Redis, a gdy jedna wysyła wiadomość na dany kanał, wszystkie inne ją odbierają i przekazują swoim klientom. To standard w nowoczesnych architekturach (np. Socket.IO z adapterem Redis).
Pamiętaj też o ograniczeniach przeglądarek: niektóre blokują WebSocket do 6 równoczesnych połączeń na domenę. Jeśli Twój sklep używa wielu poddomen, możesz napotkać limity. Zadbaj o to, aby nie otwierać niepotrzebnych połączeń.
Przykład z życia – jak naprawiliśmy WebSocket u klienta
Klient prowadził sklep z modą, który podczas wyprzedaży miał ogromny ruch. Zaimplementowali WebSocket do dynamicznego odświeżania cennika i stanów magazynowych. Niestety, zapomnieli o autoryzacji i mechanizmie reconnect. Efekt: „hakerzy” (tak naprawdę sprytni klienci) odkryli, że mogą wysyłać własne wiadomości z cenami – pojawiły się produkty po 1 złotym. Po drugie, przy każdym odświeżeniu strony lub utracie połączenia, koszyk znikał. Sklep stracił mnóstwo zamówień.
Wdrożyliśmy:
- Autoryzację przez JWT (token w URL podczas handshake).
- Walidację po stronie serwera – każda wiadomość była sprawdzana pod kątem poprawności i zgodności z sesją zakupową.
- Mechanizm reconnect z zapisem stanu koszyka w localStorage.
- Redis do skalowania – sklep urósł do 50 000 użytkowników jednocześnie bez problemów.
Rezultat: czas realizacji zamówienia spadł o 30% (bo użytkownicy nie musieli odświeżać), a liczba porzuconych koszyków zmniejszyła się o 15%.
Podsumowanie
WebSocket to potężne narzędzie, ale jak każde – wymaga mądrego wdrożenia. Nie używaj go do wszystkiego, zabezpieczaj połączenia, twórz strategię na utratę sygnału i myśl o skalowaniu od samego początku. Jeśli zrobisz to dobrze, Twój sklep zyska na szybkości, użyteczności i konwersji. A jeśli potrzebujesz pomocy w audycie swojego rozwiązania – w JurskiTech mamy doświadczenie w projektowaniu architektury czasu rzeczywistego dla e-commerce i chętnie doradzimy.
Zastanów się: ile tracisz sprzedaży przez opóźnione aktualizacje? Może warto przemyśleć swoją strategię.


