0Pricing
Lua Academy · Lektion

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)
end

Daten 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)
end

Daten 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 100

HTTP-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
end

UDP-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

  1. OpenResty-Architektur
  2. HTTP-Anfragen in Lua verarbeiten
  3. Cosockets und nicht blockierendes TCP
  4. Shared-Memory-Dictionaries
← Zurück zu Lua Academy