{"id":2706,"date":"2026-07-20T23:00:54","date_gmt":"2026-07-20T23:00:54","guid":{"rendered":"https:\/\/news.jurskitech.pl\/blog\/uncategorized\/czy-websocket-to-przepis-na-zywy-e-commerce-3-bledy-i-naprawa\/"},"modified":"2026-07-20T23:00:54","modified_gmt":"2026-07-20T23:00:54","slug":"czy-websocket-to-przepis-na-zywy-e-commerce-3-bledy-i-naprawa","status":"publish","type":"post","link":"https:\/\/news.jurskitech.pl\/blog\/warto-wiedziec\/czy-websocket-to-przepis-na-zywy-e-commerce-3-bledy-i-naprawa\/","title":{"rendered":"Czy WebSocket to przepis na \u017cywy e-commerce? 3 b\u0142\u0119dy i naprawa"},"content":{"rendered":"<p>Czy zdarzy\u0142o Ci si\u0119 doda\u0107 produkt do koszyka, po czym od\u015bwie\u017cy\u0107 stron\u0119, by zobaczy\u0107 now\u0105 liczb\u0119? A mo\u017ce podczas wyprzeda\u017cy widzia\u0142e\u015b komunikat \u201eostatnia sztuka\u201d, ale po dodaniu okazywa\u0142o si\u0119, \u017ce towar ju\u017c si\u0119 wyprzeda\u0142? To nie s\u0105 odosobnione przypadki \u2013 to codzienno\u015b\u0107 e-commerce opartego na architekturze request-response. Rozwi\u0105zaniem, kt\u00f3re eliminuje te frustracje, jest WebSocket \u2013 protok\u00f3\u0142 umo\u017cliwiaj\u0105cy komunikacj\u0119 dwukierunkow\u0105 w czasie rzeczywistym. Ale uwaga: wdro\u017cenie go na o\u015blep mo\u017ce przynie\u015b\u0107 wi\u0119cej szkody ni\u017c po\u017cytku. W tym artykule poka\u017c\u0119 trzy najcz\u0119stsze b\u0142\u0119dy we wdra\u017caniu WebSocket w e-commerce i podpowiem, jak je naprawi\u0107, by zyska\u0107 przewag\u0119 konkurencyjn\u0105.<\/p>\n<h2 id=\"czymjestwebsocketidlaczegomaznaczeniewecommerce\">Czym jest WebSocket i dlaczego ma znaczenie w e-commerce?<\/h2>\n<p>WebSocket to protok\u00f3\u0142 komunikacyjny, kt\u00f3ry utrzymuje sta\u0142e po\u0142\u0105czenie mi\u0119dzy przegl\u0105dark\u0105 a serwerem. W przeciwie\u0144stwie do klasycznego HTTP, gdzie ka\u017cda interakcja wymaga nowego \u017c\u0105dania i odpowiedzi, WebSocket pozwala serwerowi na wysy\u0142anie 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\u0119pno\u015bci produktu \u2013 wszystko bez prze\u0142adowania strony.<\/p>\n<p>Korzy\u015bci s\u0105 oczywiste: poprawa UX, wi\u0119ksza sprzeda\u017c i mniej porzuconych koszyk\u00f3w. Jednak WebSocket ma te\u017c ciemn\u0105 stron\u0119 \u2013 je\u015bli wdro\u017cymy go bez przemy\u015blenia, mo\u017cemy narazi\u0107 si\u0119 na problemy z wydajno\u015bci\u0105, bezpiecze\u0144stwem i kosztami. Oto trzy najcz\u0119stsze b\u0142\u0119dy, kt\u00f3re widz\u0119 u klient\u00f3w.<\/p>\n<h2 id=\"bd1websocketdowszystkiegoczyligdynarzdziestajesicelem\">B\u0142\u0105d 1: WebSocket do wszystkiego \u2013 czyli gdy narz\u0119dzie staje si\u0119 celem<\/h2>\n<p>Pierwszy b\u0142\u0105d to traktowanie WebSocket jako srebrnej kuli na wszystkie problemy z wydajno\u015bci\u0105. Nie ka\u017cda funkcja w e-commerce potrzebuje komunikacji w czasie rzeczywistym. Przyk\u0142ad: aktualizacja listy produkt\u00f3w po zmianie kategorii. To typowa operacja, kt\u00f3r\u0105 bez problemu obs\u0142u\u017cy klasyczne \u017c\u0105danie HTTP \u2013 u\u017cytkownik i tak musi klikn\u0105\u0107, by przej\u015b\u0107 do innej kategorii. U\u017cycie WebSocket w tym miejscu to marnowanie zasob\u00f3w: ka\u017cde po\u0142\u0105czenie utrzymuje otwarty socket, co przy tysi\u0105cach u\u017cytkownik\u00f3w generuje ogromne obci\u0105\u017cenie serwera.<\/p>\n<p>Konsekwencje: wzrost koszt\u00f3w infrastruktury i spadek og\u00f3lnej wydajno\u015bci, bo serwer musi obs\u0142ugiwa\u0107 niepotrzebne po\u0142\u0105czenia. Zamiast tego, WebSocket warto zarezerwowa\u0107 dla funkcji, kt\u00f3re naprawd\u0119 tego wymagaj\u0105: powiadomienia o stanie zam\u00f3wienia, \u017cywy podgl\u0105d koszyka na wielu urz\u0105dzeniach, wsp\u00f3lna edycja listy zakup\u00f3w, czy aukcje na \u017cywo.<\/p>\n<p>Jak to naprawi\u0107? Przeprowad\u017a audyt funkcjonalno\u015bci sklepu i zidentyfikuj te, kt\u00f3re wymagaj\u0105 natychmiastowej aktualizacji danych. Dla pozosta\u0142ych zosta\u0144 przy HTTP, a je\u015bli ju\u017c musisz u\u017cy\u0107 WebSocket \u2013 rozwa\u017c subskrypcj\u0119 tematyczn\u0105 (np. tylko dla zalogowanych u\u017cytkownik\u00f3w w trakcie sesji zakupowej).<\/p>\n<h2 id=\"bd2zaniedbaniebezpieczestwawebsocket\">B\u0142\u0105d 2: Zaniedbanie bezpiecze\u0144stwa WebSocket<\/h2>\n<p>Drugi b\u0142\u0105d to traktowanie WebSocket jako \u201ebezpiecznego\u201d tylko dlatego, \u017ce dzia\u0142a na tym samym porcie co HTTPS. To z\u0142udzenie. WebSocket nie sprawdza automatycznie to\u017csamo\u015bci u\u017cytkownika \u2013 je\u015bli nie zabezpieczysz po\u0142\u0105czenia, ka\u017cdy mo\u017ce pods\u0142uchiwa\u0107 lub wysy\u0142a\u0107 fa\u0142szywe dane. Wyobra\u017a sobie, \u017ce kto\u015b podmienia dane o cenie w koszyku lub wywo\u0142uje fa\u0142szywe powiadomienia o dost\u0119pno\u015bci \u2013 chaos gotowy.<\/p>\n<p>Najcz\u0119stsze luki:<\/p>\n<ul>\n<li>Brak autoryzacji przy ustanawianiu po\u0142\u0105czenia \u2013 ka\u017cdy mo\u017ce pod\u0142\u0105czy\u0107 si\u0119 do gniazda i zacz\u0105\u0107 odbiera\u0107 dane.<\/li>\n<li>Wysy\u0142anie wra\u017cliwych danych (np. token\u00f3w sesji) przez WebSocket w jawnej formie.<\/li>\n<li>Brak mechanizmu weryfikacji integralno\u015bci wiadomo\u015bci.<\/li>\n<\/ul>\n<p>Jak to naprawi\u0107? Zawsze u\u017cywaj WebSocket przez TLS (wss:\/\/). Autoryzuj po\u0142\u0105czenie, wysy\u0142aj\u0105c token JWT w nag\u0142\u00f3wku podczas handshake. Na serwerze sprawdzaj, czy dane przychodz\u0105ce s\u0105 zgodne z oczekiwanym formatem i nie naruszaj\u0105 regu\u0142 biznesowych. Nigdy nie ufaj danym z WebSocket \u2013 traktuj je jak ka\u017cde inne wej\u015bcie u\u017cytkownika.<\/p>\n<h2 id=\"bd3brakstrategiinautratpoczenia\">B\u0142\u0105d 3: Brak strategii na utrat\u0119 po\u0142\u0105czenia<\/h2>\n<p>Trzeci, wyj\u0105tkowo bolesny b\u0142\u0105d, to zak\u0142adanie, \u017ce po\u0142\u0105czenie WebSocket b\u0119dzie zawsze stabilne. W realnym \u015bwiecie sie\u0107 bywa kapry\u015bna: u\u017cytkownik przechodzi mi\u0119dzy sieciami Wi-Fi, wchodzi do windy, wy\u0142\u0105cza telefon. Je\u015bli aplikacja nie radzi sobie z przerwaniem po\u0142\u0105czenia, u\u017cytkownik zobaczy przestarza\u0142e dane, a nawet mo\u017ce straci\u0107 koszyk.<\/p>\n<p>Klasyczny przyk\u0142ad: Klient przegl\u0105da sklep w metrze, dodaje produkt do koszyka (WebSocket aktualizuje ikon\u0119 koszyka na 1), po czym traci zasi\u0119g. WebSocket urywa si\u0119. Po chwili sygna\u0142 wraca \u2013 strona \u0142aduje si\u0119 od nowa (bo np. SPA nie od\u015bwie\u017cy\u0142o danych) i koszyk jest pusty. Klient w\u015bciek\u0142y, a transakcja stracona.<\/p>\n<p>Jak to naprawi\u0107? Zaimplementuj mechanizm automatycznego ponownego \u0142\u0105czenia z wyk\u0142adniczym backoffem (np. pr\u00f3by co 1s, 2s, 4s, 8s). Zapisz stan koszyka w localStorage lub IndexedDB, aby po przerwaniu i ponownym po\u0142\u0105czeniu przywr\u00f3ci\u0107 go z lokalnej pami\u0119ci. Na serwerze przechowuj sesj\u0119 WebSocket i po ponownym po\u0142\u0105czeniu wysy\u0142aj pe\u0142en stan aktualny (np. lista przedmiot\u00f3w w koszyku). Mo\u017cesz te\u017c u\u017cy\u0107 heartbeat (ping-pong), aby szybko wykrywa\u0107 utrat\u0119 po\u0142\u0105czenia.<\/p>\n<h2 id=\"websocketaskalowalnoczegoniemwinakursach\">WebSocket a skalowalno\u015b\u0107 \u2013 czego nie m\u00f3wi\u0105 na kursach<\/h2>\n<p>Wdro\u017cenie WebSocket na ma\u0142ym sklepie to prosta sprawa, ale przy wi\u0119kszym ruchu trzeba pomy\u015ble\u0107 o skalowaniu. Ka\u017cde po\u0142\u0105czenie zajmuje pami\u0119\u0107 na serwerze \u2013 je\u015bli u\u017cywasz jednej instancji aplikacji, przy 10 000 r\u00f3wnoczesnych u\u017cytkownik\u00f3w mo\u017cesz jej przeci\u0105\u017cy\u0107. Rozwi\u0105zanie? U\u017cyj mened\u017cera stanu WebSocket (np. Redis Pub\/Sub) i skaluj horyzontalnie. Ka\u017cda instancja serwera subskrybuje kana\u0142y Redis, a gdy jedna wysy\u0142a wiadomo\u015b\u0107 na dany kana\u0142, wszystkie inne j\u0105 odbieraj\u0105 i przekazuj\u0105 swoim klientom. To standard w nowoczesnych architekturach (np. Socket.IO z adapterem Redis).<\/p>\n<p>Pami\u0119taj te\u017c o ograniczeniach przegl\u0105darek: niekt\u00f3re blokuj\u0105 WebSocket do 6 r\u00f3wnoczesnych po\u0142\u0105cze\u0144 na domen\u0119. Je\u015bli Tw\u00f3j sklep u\u017cywa wielu poddomen, mo\u017cesz napotka\u0107 limity. Zadbaj o to, aby nie otwiera\u0107 niepotrzebnych po\u0142\u0105cze\u0144.<\/p>\n<h2 id=\"przykadzyciajaknaprawilimywebsocketuklienta\">Przyk\u0142ad z \u017cycia \u2013 jak naprawili\u015bmy WebSocket u klienta<\/h2>\n<p>Klient prowadzi\u0142 sklep z mod\u0105, kt\u00f3ry podczas wyprzeda\u017cy mia\u0142 ogromny ruch. Zaimplementowali WebSocket do dynamicznego od\u015bwie\u017cania cennika i stan\u00f3w magazynowych. Niestety, zapomnieli o autoryzacji i mechanizmie reconnect. Efekt: &#8222;hakerzy&#8221; (tak naprawd\u0119 sprytni klienci) odkryli, \u017ce mog\u0105 wysy\u0142a\u0107 w\u0142asne wiadomo\u015bci z cenami \u2013 pojawi\u0142y si\u0119 produkty po 1 z\u0142otym. Po drugie, przy ka\u017cdym od\u015bwie\u017ceniu strony lub utracie po\u0142\u0105czenia, koszyk znika\u0142. Sklep straci\u0142 mn\u00f3stwo zam\u00f3wie\u0144.<\/p>\n<p>Wdro\u017cyli\u015bmy:<\/p>\n<ul>\n<li>Autoryzacj\u0119 przez JWT (token w URL podczas handshake).<\/li>\n<li>Walidacj\u0119 po stronie serwera \u2013 ka\u017cda wiadomo\u015b\u0107 by\u0142a sprawdzana pod k\u0105tem poprawno\u015bci i zgodno\u015bci z sesj\u0105 zakupow\u0105.<\/li>\n<li>Mechanizm reconnect z zapisem stanu koszyka w localStorage.<\/li>\n<li>Redis do skalowania \u2013 sklep ur\u00f3s\u0142 do 50 000 u\u017cytkownik\u00f3w jednocze\u015bnie bez problem\u00f3w.<\/li>\n<\/ul>\n<p>Rezultat: czas realizacji zam\u00f3wienia spad\u0142 o 30% (bo u\u017cytkownicy nie musieli od\u015bwie\u017ca\u0107), a liczba porzuconych koszyk\u00f3w zmniejszy\u0142a si\u0119 o 15%.<\/p>\n<h2 id=\"podsumowanie\">Podsumowanie<\/h2>\n<p>WebSocket to pot\u0119\u017cne narz\u0119dzie, ale jak ka\u017cde \u2013 wymaga m\u0105drego wdro\u017cenia. Nie u\u017cywaj go do wszystkiego, zabezpieczaj po\u0142\u0105czenia, tw\u00f3rz strategi\u0119 na utrat\u0119 sygna\u0142u i my\u015bl o skalowaniu od samego pocz\u0105tku. Je\u015bli zrobisz to dobrze, Tw\u00f3j sklep zyska na szybko\u015bci, u\u017cyteczno\u015bci i konwersji. A je\u015bli potrzebujesz pomocy w audycie swojego rozwi\u0105zania \u2013 w JurskiTech mamy do\u015bwiadczenie w projektowaniu architektury czasu rzeczywistego dla e-commerce i ch\u0119tnie doradzimy.<\/p>\n<p>Zastan\u00f3w si\u0119: ile tracisz sprzeda\u017cy przez op\u00f3\u017anione aktualizacje? Mo\u017ce warto przemy\u015ble\u0107 swoj\u0105 strategi\u0119.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Czy zdarzy\u0142o Ci si\u0119 doda\u0107 produkt do koszyka, po czym od\u015bwie\u017cy\u0107 stron\u0119, by zobaczy\u0107 now\u0105 liczb\u0119? A mo\u017ce podczas wyprzeda\u017cy widzia\u0142e\u015b komunikat \u201eostatnia sztuka\u201d, ale po dodaniu okazywa\u0142o si\u0119, \u017ce towar ju\u017c si\u0119 wyprzeda\u0142? To nie s\u0105 odosobnione przypadki \u2013 to codzienno\u015b\u0107 e-commerce opartego na architekturze request-response. Rozwi\u0105zaniem, kt\u00f3re eliminuje te frustracje, jest WebSocket \u2013<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[776,826,1003,107],"class_list":["post-2706","post","type-post","status-publish","format-standard","hentry","category-warto-wiedziec","tag-ai-e-commerce","tag-ai-w-ux","tag-debugowanie-wydajnosci","tag-websockets"],"_links":{"self":[{"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/posts\/2706","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/comments?post=2706"}],"version-history":[{"count":0,"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/posts\/2706\/revisions"}],"wp:attachment":[{"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/media?parent=2706"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/categories?post=2706"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/tags?post=2706"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}