Performance
Latenza di un'API: da dove arrivano i millisecondi
Su venti richieste a /api/stats la mediana è 100 ms: 16 di DNS, 19 di TCP, 29 di TLS e 36 di server. Su un endpoint pesante il server sale a 355 ms.
In sintesi
- La latenza di un'API si scompone in DNS, TCP, TLS e server: curl stampa ogni fase con -w.
- Su venti richieste a /api/stats la mediana è 100 ms, di cui 36 ms di server.
- L'handshake pesa 64 ms su 100: sul primo byte della prima richiesta è il 64% del tempo.
- Su un endpoint da 22 KB il server passa a 355 ms: la query, non la rete, decide.
La latenza di un'API si misura in quattro pezzi separati, non in un solo numero: DNS, connessione TCP, handshake TLS e tempo del server. Su venti richieste consecutive a https://ui.eneawork.it/api/stats la mediana è 100 ms, e solo 36 ms sono del server: il resto lo spendono rete e handshake.
La scomposizione di una richiesta
| Fase | Campo curl | Mediana | Quota |
|---|---|---|---|
| DNS | time_namelookup | 16 ms | 16% |
| TCP | time_connect - time_namelookup | 19 ms | 19% |
| TLS | time_appconnect - time_connect | 29 ms | 29% |
| Server e primo byte | time_starttransfer - time_appconnect | 36 ms | 36% |
Somma delle quattro fasi: 100 ms, coerente con la mediana di time_total. La connessione riusa lo stesso socket per tutte le richieste della serie? No: ogni invocazione di curl apre una connessione nuova, quindi l'handshake si paga ogni volta. È lo scenario peggiore, ed è quello che vede un client che chiama l'API una volta sola.
Il comando
for i in $(seq 1 20); do
curl -s -o /dev/null -w "%{time_namelookup} %{time_connect} %{time_appconnect} %{time_starttransfer} %{size_download}\n" \
https://example.com/api/stats
done
Il comando richiede bash, curl e una connessione. Sostituisci l'URL con il tuo endpoint. time_appconnect è zero sulle connessioni in chiaro, quindi su HTTP la fase TLS sparisce e il confronto con HTTPS non è onesto.
Dove finisce il tempo quando la risposta cresce
L'endpoint leggero risponde in 102 byte; quello dei tag in 22.866 byte, 224 volte tanto, e passa da 100 a 421 ms. La differenza non si spiega con i byte: a 1 Mbps 22 KB viaggiano in meno di 200 ms. Il resto è lavoro del server, che aggrega i tag prima di rispondere. La domanda giusta non è "come comprimo meglio", è "perché questa risposta si costruisce a ogni richiesta".
Il limite da dichiarare
I numeri vengono da una sola rete e da un solo momento: la latenza verso il server cambia con la posizione del client, e una CDN davanti all'API sposta la fase DNS e TLS su un edge. In più, una raffica di richieste ha restituito 429: quando c'è un rate limiter, la latenza include anche la sua decisione, e va misurata con la stessa frequenza che usa il client vero.
Dove continuare
Il catalogo EneUI indicizza 111.985 componenti, 1.556 blocchi e l'icona brand speedtest, utile per dare un volto al pannello di latenza. Per la metrica che contiene questa, leggi TTFB: cosa misura, per togliere l'handshake iniziale preconnect e dns-prefetch, per il peso dei byte Brotli contro gzip, e per il confronto tra architetture framework frontend a confronto.
Domande frequenti
Qual è una latenza accettabile per un'API?
Sotto 200 ms al 75° percentile un'interfaccia resta reattiva. Sopra 500 ms l'utente nota l'attesa, e sopra 1 s cambia comportamento. Il numero va letto insieme al tempo di rendering della pagina che la chiama.
Perché il primo byte arriva dopo 36 ms ma la risposta pesa 22 KB?
Perché time_starttransfer misura l'arrivo del primo byte, non dell'ultimo. Il trasferimento dei byte restanti si legge con time_total. Su risposte grandi la differenza tra i due campi è la parte di rete.
Quanto pesa l'handshake su una chiamata sola?
Nella nostra misura 64 ms su 100, cioè DNS, TCP e TLS insieme. Su una pagina che fa dieci chiamate allo stesso host il costo si paga una volta, se la connessione resta aperta con keep-alive.
La compressione riduce la latenza dell'API?
Riduce il tempo di trasferimento dei byte, non il tempo del server. Su un JSON da 22 KB aiuta; su una risposta da 100 byte aggiunge lavoro e può peggiorare il primo byte.
Come misuro la latenza dalla posizione dei miei utenti?
Con dati di campo raccolti nel browser, non con curl dal tuo portatile. Un endpoint di telemetria che registra la durata lato client dà il numero vero; curl serve a separare le fasi quando il numero è alto.