Pattern di Long Polling e logica di riconnessione
Implementi il long polling con backoff esponenziale e riconnessione automatica usando useEffect e AbortController.
Pattern di Long Polling e logica di riconnessione è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento React Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso React Academy include 4 lezioni in totale.
Flusso del long polling
Il long polling funziona in un ciclo: il client invia una richiesta HTTP, il server mantiene aperta la connessione finché non sono disponibili nuovi dati (o finché non si verifica un timeout, in genere di 30-60 secondi), il server risponde con i dati e il client invia immediatamente un'altra richiesta. Si crea così una connessione quasi continua, con caratteristiche di push dal server.
Implementazione del long polling in useEffect
Il long polling in React utilizza una funzione asincrona ricorsiva all'interno di useEffect. La funzione esegue una richiesta fetch, elabora la risposta e poi richiama se stessa. Un segnale AbortController interrompe la ricorsione quando il componente viene smontato. La funzione continua a ripetersi finché il componente è montato e non è stato segnalato un abort.
AbortController per la pulizia
Crei un AbortController all'inizio di useEffect e passi controller.signal a ogni chiamata fetch. Nella funzione di pulizia, chiami controller.abort(). In questo modo annulla qualsiasi richiesta in corso quando il componente viene smontato, evitando aggiornamenti di stato su componenti smontati e perdite di risorse di rete.
Exponential backoff in caso di errore
Quando una richiesta di long polling non riesce, non esegua immediatamente un nuovo tentativo: attenda prima della richiesta successiva. L'exponential backoff raddoppia il ritardo dopo ogni errore consecutivo: 1s, 2s, 4s, 8s, 16s, fino a un massimo di 30s. In questo modo si evita di sovraccaricare un server in errore e gli si concede il tempo di risolvere eventuali problemi temporanei. Reimposti il ritardo a 1s dopo una risposta corretta.
Aggiunta del jitter al backoff
Quando molti client interrogano lo stesso server, l'exponential backoff senza jitter causa il fenomeno del "thundering herd": tutti i client attendono lo stesso intervallo e riprovano simultaneamente, sovraccaricando di nuovo il server. Aggiunga il jitter randomizzando il ritardo: delay + Math.random() * delay. In questo modo i nuovi tentativi vengono distribuiti su un intervallo di tempo, riducendo i picchi di carico sul server.
Stato della connessione
Mantenga lo stato della connessione per rappresentare il ciclo di vita del polling: isConnecting (connessione iniziale o riconnessione dopo un errore), isConnected (l'ultimo polling è riuscito), isError (errori consecutivi, numero massimo di tentativi raggiunto). Mostri questo stato nell'interfaccia, così gli utenti possono comprendere l'affidabilità dei dati in tempo reale.
Visualizzazione del timer per il polling successivo
Durante il ritardo del backoff prima del nuovo tentativo, può mostrare un conto alla rovescia, ad esempio: "Nuova connessione tra 8s...", insieme a un indicatore di avanzamento. Calcoli il timestamp del nuovo tentativo quando imposta il timer del backoff e aggiorni la visualizzazione ogni secondo. Questa trasparenza rassicura gli utenti mostrando che l'applicazione sta tentando attivamente di ripristinare la connessione.
setTimeout ricorsivo o setInterval
Per il polling, utilizzi un setTimeout ricorsivo (richiami il polling successivo all'interno del gestore della risposta) invece di setInterval. setInterval viene eseguito a intervalli fissi indipendentemente dalla durata della richiesta precedente: le richieste di lunga durata possono causare polling sovrapposti. Il setTimeout ricorsivo avvia il polling successivo solo dopo il completamento di quello precedente.
Configurazione dell'intervallo di polling
Renda l'intervallo di polling un'opzione di configurazione del suo hook: useLongPoll({ url, interval: 5000 }). Fonti di dati diverse richiedono livelli diversi di aggiornamento: un indicatore "chi è online" potrebbe eseguire il polling ogni 30s, mentre lo stato di un'attività potrebbe richiederlo ogni 5s. Eviti di codificare gli intervalli direttamente nell'implementazione.
Passaggio dal polling a SSE
Con la maturazione della sua API, potrebbe sostituire il polling con SSE per una maggiore efficienza. Il componente React che utilizza un hook di polling dovrebbe essere separato dal livello di trasporto. Se il suo hook espone la stessa interfaccia (onData, status, error), il passaggio dal polling a EventSource al suo interno non richiede modifiche al componente che utilizza l'hook.
Gestione del timeout lato server
Quando il server mantiene una connessione di long polling e non arrivano dati, deve rispondere con un timeout (200 con corpo vuoto oppure 204 No Content) per evitare che la connessione resti appesa indefinitamente. Il client esegue quindi immediatamente un nuovo polling. Questo timeout lato server (30-60s) è distinto dal timeout di fetch lato client (più lungo, ad esempio 90s).
Scopo dell'exponential backoff
Perché il long polling utilizza l'exponential backoff quando riprova dopo gli errori di connessione?
Riepilogo della lezione: long polling
Long polling: il client invia una richiesta, il server attende finché non sono disponibili dati o si verifica un timeout, quindi il client invia immediatamente una nuova richiesta dopo la risposta. Lo implementi con una fetch asincrona ricorsiva in useEffect e AbortController per la pulizia. In caso di errore, utilizzi l'exponential backoff (1s, 2s, 4s... fino a un massimo di 30s) insieme al jitter per evitare il thundering herd. Preferisca setTimeout ricorsivo a setInterval per evitare il polling sovrapposto. Tenga traccia dello stato isConnecting/isConnected/isError per fornire feedback nell'interfaccia.
Impara React con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 88
- Lezioni
- 324
Domande Frequenti
La lezione «Pattern di Long Polling e logica di riconnessione» è gratuita?
Sì — il testo completo di «Pattern di Long Polling e logica di riconnessione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso React Academy, passa a CoddyKit PRO. Il corso React Academy include 4 lezioni in totale.
Cosa imparerò in «Pattern di Long Polling e logica di riconnessione»?
Implementi il long polling con backoff esponenziale e riconnessione automatica usando useEffect e AbortController. Eserciti React Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare React Academy?
Non è richiesta alcuna esperienza precedente. React Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Pattern di Long Polling e logica di riconnessione»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione React Academy?
Sì. Ogni lezione React Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Confronto tra SSE, WebSocket e polling
- Consumare stream SSE in React con EventSource
- Pattern di Long Polling e logica di riconnessione
- Creazione di un feed di notifiche in tempo reale