Cosockets und nicht blockierendes TCP
Verwenden Sie ngx.socket.tcp für asynchrone Backend-Verbindungen in content_by_lua
Cosockets und nicht blockierendes TCP ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Was sind Cosockets?
Cosockets in OpenResty sind nicht blockierende TCP/UDP-Sockets, die in die Event-Schleife von Nginx integriert sind. Beim Warten auf Daten gibt die Cosocket ihre Coroutine ab, sodass der Worker andere Anfragen verarbeiten kann.
TCP-Cosocket erstellen
Verwenden Sie ngx.socket.tcp(), um einen Cosocket zu erstellen. Verbindungen herstellen, Senden und Empfangen geben automatisch die Kontrolle ab, wenn die I/O-Operation blockieren würde.
-- 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)
endDaten senden
sock:send(data) sendet eine Zeichenfolge. Bei Erfolg werden die gesendeten Bytes zurückgegeben, bei einem Fehler nil plus eine Fehlermeldung.
local bytes, err = sock:send("PING\r\n")
if not bytes then
ngx.log(ngx.ERR, "Send error: ", err)
endDaten empfangen
sock:receive(pattern) liest Daten. Muster: "*l" liest eine Zeile, "*a" liest bis zum Schließen alles ein, eine Zahl liest genau N Bytes.
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)Zeitüberschreitungen setzen
Setzen Sie Zeitüberschreitungen für das Herstellen der Verbindung, das Senden und das Empfangen, um ein Hängenbleiben zu verhindern.
sock:settimeout(1000) -- 1 second timeout
-- or separate timeouts:
sock:settimeouts(1000, 5000, 5000) -- connect, send, receive (ms)Verbindungspool
sock:setkeepalive(timeout, pool_size) legt den Socket zur Wiederverwendung in einem Pool ab. Das ist entscheidend für die Performance von Redis/MySQL.
sock:setkeepalive(60000, 100) -- 60s timeout, pool size 100HTTP-Anfrage stellen
Implementieren Sie mit einem Cosocket eine einfache HTTP/1.0-GET-Anfrage.
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() erstellt einen UDP-Cosocket. Er eignet sich beispielsweise für die Übermittlung von StatsD-Metriken.
local udp = ngx.socket.udp()
udp:setpeername("statsd.local", 8125)
udp:send("requests:1|c")Muster zur Fehlerbehandlung
Alle Cosocket-Methoden folgen der Lua-Konvention: Bei einem Fehler werden nil plus eine Fehlermeldung zurückgegeben. Prüfen Sie immer beide Rückgabewerte.
Einschränkungen von Cosockets
Cosockets können nicht in init_by_lua, set_by_lua und header_filter_by_lua verwendet werden. Verwenden Sie sie nur in den Phasen content, access und rewrite.
Leistungsvergleich
Cosockets erreichen denselben Durchsatz wie reiner, auf epoll basierender C-Code, da sie direkt die I/O-Mechanismen von Nginx verwenden. Es entsteht kein zusätzlicher Overhead durch Threads oder Prozesse.
Cosocket-Frage
Was geschieht, wenn ein Cosocket auf Daten von einem langsamen Server wartet?
Zusammenfassung: Cosockets und nicht blockierendes TCP
Cosockets in OpenResty stellen nicht blockierendes TCP/UDP bereit und geben bei I/O-Operationen die Kontrolle ab, wodurch eine hohe Nebenläufigkeit möglich wird. Verwenden Sie setkeepalive für Connection Pooling. Setzen Sie Zeitüberschreitungen, um ein Hängenbleiben zu vermeiden. Sie sind nur in den Phasen content, access und rewrite verfügbar.
Häufig gestellte Fragen
Ist die Lektion „Cosockets und nicht blockierendes TCP“ kostenlos?
Ja — der vollständige Text von „Cosockets und nicht blockierendes TCP“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Cosockets und nicht blockierendes TCP“?
Verwenden Sie ngx.socket.tcp für asynchrone Backend-Verbindungen in content_by_lua Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Lua Academy zu starten?
Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Cosockets und nicht blockierendes TCP“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?
Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- OpenResty-Architektur
- HTTP-Anfragen in Lua verarbeiten
- Cosockets und nicht blockierendes TCP
- Shared-Memory-Dictionaries