La singola modifica più efficace per migliorare le prestazioni di un proxy non è acquistare un proxy più veloce, bensì riutilizzare la connessione esistente. Un client che apre una nuova connessione per ogni richiesta paga continuamente il costo di apertura della connessione, e quel costo si moltiplica passando attraverso il proxy.
Il costo reale dell'apertura di una connessione
Questi 200 ms si pagano di nuovo a ogni nuova connessione. Se invii 1.000 richieste e apri ogni volta una nuova connessione, spendi 200 secondi solo per l'apertura.
Come funziona il Keep-Alive?
In HTTP/1.1 le connessioni sono persistenti per impostazione predefinita: dopo l'arrivo della risposta la connessione non si chiude e la richiesta successiva viene inviata sullo stesso socket. Tre cose rompono questo comportamento:
- Il server
Connection: closeinvia — la connessione viene chiusa. - Il client crea un nuovo oggetto sessione a ogni richiesta — il pool non entra mai in funzione.
- Il tempo di inattività viene superato — il proxy o il server chiude la connessione.
Creare nel codice un nuovo oggetto Session, Client oppure Agent per ogni richiesta. Questo disabilita completamente il riutilizzo delle connessioni, qualunque sia la configurazione del pool.
Configurazione corretta
Mantieni la dimensione del pool appena al di sotto del limite di concorrenza del tuo provider. Se lo superi, le connessioni in eccesso vengono aperte e chiuse subito.
Quanto si guadagna?
Nella misurazione di esempio l'uso del pool riduce il tempo totale a circa un terzo. Il guadagno cresce all'aumentare della latenza verso il proxy.
Riutilizzo della sessione TLS
Accanto al pool di connessioni esiste una seconda fonte di guadagno: il ticket di sessione TLS. Riconnettendosi allo stesso target è possibile eseguire un handshake abbreviato invece di quello completo. La maggior parte dei client moderni lo fa in automatico; l'importante è riutilizzare l'oggetto client.
Se ricrei l'oggetto client a ogni richiesta il ticket di sessione va perso e ogni volta viene eseguito un handshake completo.
L'equilibrio del tempo di inattività
Anche tenere una connessione aperta troppo a lungo può creare problemi: il proxy o il server di destinazione possono chiuderla silenziosamente e il tuo client se ne accorge solo alla richiesta successiva. Da qui il tipico schema "la prima richiesta fallisce, la seconda riesce".
| Impostazione | Consigliato | Perché |
|---|---|---|
| keepalive_expiry | 30–60 s | Deve essere inferiore al timeout del server |
| Dimensione del pool | Sotto il limite di concorrenza | L'eccesso è handshake sprecato |
| Retry | 1 volta | Compensa una connessione caduta |
| Limite di durata della connessione | 5–10 min | Le connessioni troppo longeve diventano stantie |
Mantieni il tempo di inattività inferiore al timeout del server. Così sei tu a chiudere la connessione e non si verifica la situazione "il server ha chiuso ma io non lo so".
Il conflitto con la rotazione
Il riutilizzo delle connessioni e la rotazione degli IP sono naturalmente in conflitto: usare la stessa connessione significa restare sullo stesso IP di uscita. Non è un problema, è una scelta:
Nella maggior parte degli scenari la seconda opzione è quella giusta: riutilizza la connessione per un certo periodo (ad esempio 30 richieste o 5 minuti), poi rinnovala.
Per le strategie di rotazione al nostro articolo sulle impostazioni di rotazione puoi consultarlo.
Riepilogo
Keep-alive e pool di connessioni sono la più grande leva singola sulle prestazioni del proxy. Crea l'oggetto client una sola volta e riutilizzalo, mantieni la dimensione del pool sotto il limite del provider, imposta il tempo di inattività più breve del timeout del server e aggiungi un singolo retry. Se hai bisogno di rotazione, invece di disattivare il pool preferisci un rinnovo periodico. Per la misurazione test del ping e controllo proxy i nostri strumenti.