0Pricing
Lua Academy · Lezione

Cosocket e TCP non bloccante

Utilizzi ngx.socket.tcp per connessioni asincrone al backend in content_by_lua.

Cosocket e TCP non bloccante è una lezione Lua 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 Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.

Cosa sono i cosocket?

I cosocket di OpenResty sono socket TCP/UDP non bloccanti che si integrano con l'event loop di Nginx. Quando attendono dati, cedono il controllo della coroutine, lasciando libero il worker di gestire altre richieste.

Creazione di un cosocket TCP

Utilizzi ngx.socket.tcp() per creare un cosocket. Le operazioni di connessione, invio e ricezione cedono automaticamente il controllo quando l'I/O potrebbe bloccarsi.

-- content_by_lua_block
local sock = ngx.socket.tcp()
local ok, err = sock:connect("redis.local", 6379)
if not ok then
  ngx.log(ngx.ERR, "Connect failed: ", err)
  return ngx.exit(500)
end

Invio dei dati

sock:send(data) invia una stringa. Restituisce i byte inviati oppure nil + una stringa di errore.

local bytes, err = sock:send("PING\r\n")
if not bytes then
  ngx.log(ngx.ERR, "Send error: ", err)
end

Ricezione dei dati

sock:receive(pattern) legge i dati. Pattern: "*l" legge una riga, "*a" legge tutto fino alla chiusura, un numero legge esattamente N byte.

local data, err = sock:receive("*l")
if not data then
  ngx.log(ngx.ERR, "Receive error: ", err)
  return ngx.exit(500)
end
ngx.say("Response: " .. data)

Impostazione dei timeout

Imposti i timeout di connessione, invio e ricezione per evitare blocchi indefiniti.

sock:settimeout(1000)  -- 1 second timeout
-- or separate timeouts:
sock:settimeouts(1000, 5000, 5000)  -- connect, send, receive (ms)

Pool di connessioni

sock:setkeepalive(timeout, pool_size) reinserisce il socket in un pool per riutilizzarlo. È fondamentale per le prestazioni di Redis/MySQL.

sock:setkeepalive(60000, 100)  -- 60s timeout, pool size 100

Esecuzione di una richiesta HTTP

Implementi una semplice richiesta GET HTTP/1.0 utilizzando un cosocket.

local function httpGet(host, path)
  local sock = ngx.socket.tcp()
  sock:connect(host, 80)
  sock:send("GET " .. path .. " HTTP/1.0\r\nHost: " .. host .. "\r\n\r\n")
  local resp = sock:receive("*a")
  sock:close()
  return resp
end

Cosocket UDP

ngx.socket.udp() crea un cosocket UDP. È utile per l'invio di metriche a statsd.

local udp = ngx.socket.udp()
udp:setpeername("statsd.local", 8125)
udp:send("requests:1|c")

Schema di gestione degli errori

Tutti i metodi dei cosocket seguono la convenzione di Lua: nil + stringa di errore in caso di fallimento. Controlli sempre entrambi i valori restituiti.

Limitazioni dei cosocket

I cosocket non possono essere utilizzati in: init_by_lua, set_by_lua, header_filter_by_lua. Li utilizzi solo nelle fasi content, access e rewrite.

Confronto delle prestazioni

I cosocket raggiungono lo stesso throughput del codice C che utilizza direttamente epoll, perché usano direttamente il sistema I/O di Nginx. Non comportano alcun overhead aggiuntivo di thread o processi.

Domanda sui cosocket

Che cosa accade quando un cosocket attende dati da un server lento?

Riepilogo: cosocket e TCP non bloccante

I cosocket di OpenResty forniscono TCP/UDP non bloccante e cedono il controllo durante l'I/O, consentendo un'elevata concorrenza. Utilizzi setkeepalive per il pooling delle connessioni. Imposti i timeout per evitare blocchi indefiniti. Sono disponibili solo nelle fasi content/access/rewrite.

Domande Frequenti

La lezione «Cosocket e TCP non bloccante» è gratuita?

Sì — il testo completo di «Cosocket e TCP non bloccante» è 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 Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.

Cosa imparerò in «Cosocket e TCP non bloccante»?

Utilizzi ngx.socket.tcp per connessioni asincrone al backend in content_by_lua. Eserciti Lua 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 Lua Academy?

Non è richiesta alcuna esperienza precedente. Lua 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 «Cosocket e TCP non bloccante»?

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 Lua Academy?

Sì. Ogni lezione Lua 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

  1. Architettura di OpenResty
  2. Gestione delle richieste HTTP in Lua
  3. Cosocket e TCP non bloccante
  4. Dizionari in memoria condivisa
← Torna a Lua Academy