Cosockets og ikke-blokkerende TCP
Bruk ngx.socket.tcp til asynkrone backend-tilkoblinger i content_by_lua.
Cosockets og ikke-blokkerende TCP er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Lua Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Lua Academy inneholder totalt 4 leksjoner.
Hva er cosockets?
OpenResty-cosockets er ikke-blokkerende TCP/UDP-sockets som integreres med Nginx' event loop. Når de venter på data, gir de fra seg koroutinen, slik at worker-prosessen kan håndtere andre forespørsler.
Opprette en TCP-cosocket
Bruk ngx.socket.tcp() til å opprette en cosocket. Tilkobling, sending og mottak gir automatisk fra seg kontrollen når I/O ville ha blokkert.
-- 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)
endSende data
sock:send(data) sender en streng. Returnerer antallet sendte byte eller nil + en feilstreng.
local bytes, err = sock:send("PING\r\n")
if not bytes then
ngx.log(ngx.ERR, "Send error: ", err)
endMotta data
sock:receive(pattern) leser data. Mønstre: "*l" leser en linje, "*a" leser alt frem til tilkoblingen lukkes, og et tall leser nøyaktig 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)Angi tidsavbrudd
Angi tidsavbrudd for tilkobling, sending og mottak for å forhindre at operasjoner blir hengende.
sock:settimeout(1000) -- 1 second timeout
-- or separate timeouts:
sock:settimeouts(1000, 5000, 5000) -- connect, send, receive (ms)Tilkoblingspool
sock:setkeepalive(timeout, pool_size) legger socketen tilbake i en pool for gjenbruk. Dette er avgjørende for ytelsen til Redis/MySQL.
sock:setkeepalive(60000, 100) -- 60s timeout, pool size 100Utføre en HTTP-forespørsel
Implementer en enkel HTTP/1.0 GET-forespørsel ved hjelp av en 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
endUDP-cosocket
ngx.socket.udp() oppretter en UDP-cosocket. Nyttig for rapportering av statsd-målinger.
local udp = ngx.socket.udp()
udp:setpeername("statsd.local", 8125)
udp:send("requests:1|c")Mønster for feilhåndtering
Alle cosocket-metoder følger Lua-konvensjonen: nil + en feilstreng ved feil. Kontroller alltid begge returverdiene.
Begrensninger for cosockets
Cosockets kan ikke brukes i: init_by_lua, set_by_lua, header_filter_by_lua. Bruk dem bare i content-, access- og rewrite-fasene.
Ytelsessammenligning
Cosockets oppnår samme gjennomstrømning som rå, epoll-basert C-kode fordi de bruker Nginx' I/O-mekanisme direkte. Ingen ekstra kostnad for tråder eller prosesser.
Cosocket-spørsmål
Hva skjer når en cosocket venter på data fra en treg server?
Oppsummering: Cosockets og ikke-blokkerende TCP
OpenResty-cosockets tilbyr ikke-blokkerende TCP/UDP som gir fra seg kontrollen ved I/O, noe som muliggjør høy samtidighet. Bruk setkeepalive for tilkoblingspooling. Angi tidsavbrudd for å unngå heng. De er bare tilgjengelige i content-, access- og rewrite-fasene.
Lær deg Lua med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 40
- Leksjoner
- 159
Ofte stilte spørsmål
Er leksjonen «Cosockets og ikke-blokkerende TCP» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Cosockets og ikke-blokkerende TCP», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Lua Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Cosockets og ikke-blokkerende TCP»?
Bruk ngx.socket.tcp til asynkrone backend-tilkoblinger i content_by_lua. Du øver på Lua Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Lua Academy?
Ingen tidligere erfaring er nødvendig. Lua Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Cosockets og ikke-blokkerende TCP»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Lua Academy-leksjonen?
Ja. Alle Lua Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- OpenResty-arkitektur
- Håndtere HTTP-forespørsler i Lua
- Cosockets og ikke-blokkerende TCP
- Delte minneordbøker