0Pricing
React Academy · Lekcja

Wzorzec long pollingu i logika ponownego łączenia

Zaimplementują Państwo long polling z wykładniczym zwiększaniem opóźnienia i automatycznym ponownym łączeniem za pomocą useEffect oraz AbortController.

Wzorzec long pollingu i logika ponownego łączenia to bezpłatna lekcja React Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.

Przebieg long pollingu

Long polling działa w cyklu: klient wysyła żądanie HTTP, serwer utrzymuje połączenie otwarte do momentu udostępnienia nowych danych (albo wystąpienia limitu czasu, zwykle po 30–60 sekundach), serwer odpowiada danymi, a klient natychmiast wysyła kolejne żądanie. Tworzy to niemal ciągłe połączenie o charakterystyce wypychania danych przez serwer.

Implementacja long pollingu w useEffect

Long polling w React wykorzystuje asynchroniczną funkcję rekurencyjną wewnątrz useEffect. Funkcja wykonuje żądanie fetch, przetwarza odpowiedź, a następnie wywołuje samą siebie ponownie. Sygnał AbortController zatrzymuje rekurencję po odmontowaniu komponentu. Funkcja wykonuje kolejne iteracje tak długo, jak długo komponent jest zamontowany i nie zasygnalizowano przerwania.

AbortController do sprzątania

Na początku useEffect należy utworzyć AbortController i przekazać controller.signal do każdego wywołania fetch. W funkcji sprzątającej należy wywołać controller.abort(). Anuluje to każde trwające żądanie po odmontowaniu komponentu, zapobiegając aktualizowaniu stanu odmontowanych komponentów oraz wyciekom zasobów sieciowych.

Wykładniczy backoff po błędzie

Gdy żądanie long pollingu się nie powiedzie, nie należy ponawiać go natychmiast — przed kolejną próbą trzeba odczekać. Wykładniczy backoff podwaja opóźnienie przy każdej kolejnej awarii: 1 s, 2 s, 4 s, 8 s, 16 s, z ograniczeniem do 30 s. Zapobiega to przeciążaniu niesprawnego serwera i daje czas na rozwiązanie przejściowych problemów. Po pomyślnej odpowiedzi należy przywrócić opóźnienie do 1 s.

Dodawanie jittera do backoffu

Gdy wielu klientów odpyta ten sam serwer, wykładniczy backoff bez jittera powoduje efekt „thundering herd”: wszyscy klienci odczekują tyle samo i ponawiają żądania jednocześnie, ponownie przeciążając serwer. Jitter można dodać przez losowe ustalenie opóźnienia: delay + Math.random() * delay. Rozkłada to ponowne próby w określonym przedziale czasu i ogranicza skoki obciążenia serwera.

Stan połączenia

Należy przechowywać stan połączenia, aby odzwierciedlał cykl życia odpytywania: isConnecting (nawiązywanie początkowego połączenia lub ponowne łączenie po błędzie), isConnected (ostatnie odpytywanie zakończyło się powodzeniem), isError (kolejne awarie, osiągnięto maksymalną liczbę prób). Stan ten należy wyświetlać w interfejsie, aby użytkownicy rozumieli niezawodność danych w czasie rzeczywistym.

Wyświetlanie czasu do następnego odpytywania

Podczas oczekiwania na kolejną próbę w ramach backoffu można wyświetlić odliczanie: „Ponowne łączenie za 8 s...” wraz ze wskaźnikiem postępu. Podczas ustawiania timera backoffu należy obliczyć znacznik czasu ponownej próby i aktualizować wyświetlaną wartość co sekundę. Taka przejrzystość daje użytkownikom pewność, że aplikacja aktywnie próbuje odzyskać połączenie.

Rekurencyjne setTimeout a setInterval

Do odpytywania należy używać rekurencyjnego setTimeout (wywołując kolejne odpytywanie w handlerze odpowiedzi), a nie setInterval. setInterval uruchamia funkcję w stałych odstępach, niezależnie od czasu trwania poprzedniego żądania — długotrwałe żądania mogą powodować nakładanie się odpytań. Rekurencyjne setTimeout rozpoczyna kolejne odpytywanie dopiero po zakończeniu poprzedniego.

Konfiguracja interwału odpytywania

Interwał odpytywania należy udostępnić jako opcję konfiguracyjną hooka: useLongPoll({ url, interval: 5000 }). Różne źródła danych wymagają różnej aktualności: wskaźnik „kto jest online” może odpytywać serwer co 30 s, a status zadania — co 5 s. Należy unikać zakodowanych na stałe interwałów w kodzie implementacji.

Przejście z odpytywania na SSE

W miarę dojrzewania API można zastąpić odpytywanie przez SSE, aby zwiększyć wydajność. Komponent React korzystający z hooka do odpytywania powinien być odseparowany od warstwy transportowej. Jeśli hook udostępnia ten sam interfejs (onData, status, error), przełączenie z odpytywania na EventSource wewnątrz hooka nie wymaga zmian w komponencie, który z niego korzysta.

Obsługa limitu czasu po stronie serwera

Gdy serwer utrzymuje połączenie long pollingu i nie pojawiają się żadne dane, musi odpowiedzieć po upływie limitu czasu (statusem 200 z pustym ciałem albo statusem 204 No Content), aby zapobiec bezterminowemu zawieszeniu połączenia. Klient natychmiast rozpoczyna wtedy kolejne odpytywanie. Ten limit czasu po stronie serwera (30–60 s) jest niezależny od limitu czasu fetch po stronie klienta (dłuższego, np. 90 s).

Cel wykładniczego backoffu

Dlaczego long polling używa wykładniczego backoffu podczas ponawiania prób po błędach połączenia?

Podsumowanie lekcji: long polling

Long polling: klient wysyła żądanie, serwer utrzymuje połączenie do momentu udostępnienia danych lub wystąpienia limitu czasu, a klient natychmiast wysyła kolejne żądanie po otrzymaniu odpowiedzi. Należy użyć rekurencyjnego asynchronicznego fetch w useEffect oraz AbortController do sprzątania. W razie błędu należy zastosować wykładniczy backoff (1 s, 2 s, 4 s... z ograniczeniem do 30 s) wraz z jitterem, aby zapobiec efektowi thundering herd. Należy używać rekurencyjnego setTimeout zamiast setInterval, aby zapobiec nakładaniu się odpytań. Do informacji zwrotnej w interfejsie należy śledzić stan isConnecting/isConnected/isError.

Często zadawane pytania

Czy lekcja „Wzorzec long pollingu i logika ponownego łączenia” jest bezpłatna?

Tak — pełny tekst „Wzorzec long pollingu i logika ponownego łączenia” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wzorzec long pollingu i logika ponownego łączenia”?

Zaimplementują Państwo long polling z wykładniczym zwiększaniem opóźnienia i automatycznym ponownym łączeniem za pomocą useEffect oraz AbortController. Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć React Academy?

Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Wzorzec long pollingu i logika ponownego łączenia”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?

Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Porównanie SSE, WebSockets i pollingu
  2. Korzystanie ze strumieni SSE w React z EventSource
  3. Wzorzec long pollingu i logika ponownego łączenia
  4. Budowanie kanału powiadomień w czasie rzeczywistym
← Powrót do React Academy