0Pricing
Lua Academy · Lección

Cosockets y TCP no bloqueante

Utilice ngx.socket.tcp para conexiones asíncronas con backends en content_by_lua.

Cosockets y TCP no bloqueante es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué son los cosockets?

Los cosockets de OpenResty son sockets TCP/UDP no bloqueantes que se integran con el bucle de eventos de Nginx. Al esperar datos, ceden la ejecución de la corrutina y liberan el worker para gestionar otras solicitudes.

Creación de un cosocket TCP

Utilice ngx.socket.tcp() para crear un cosocket. Las operaciones de conexión, envío y recepción ceden automáticamente la ejecución cuando la E/S bloquearía el proceso.

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

Envío de datos

sock:send(data) envía una cadena. Devuelve los bytes enviados o nil + un error.

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

Recepción de datos

sock:receive(pattern) lee datos. Patrones: "*l" lee una línea, "*a" lee todo hasta el cierre y un número lee exactamente 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)

Configuración de tiempos de espera

Establezca tiempos de espera para la conexión, el envío y la recepción a fin de evitar que el proceso quede bloqueado.

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

Grupo de conexiones

sock:setkeepalive(timeout, pool_size) devuelve el socket a un grupo para reutilizarlo. Es fundamental para el rendimiento de Redis/MySQL.

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

Realización de una solicitud HTTP

Implemente una solicitud GET sencilla de HTTP/1.0 mediante 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. Resulta útil para informar de métricas a statsd.

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

Patrón de gestión de errores

Todos los métodos de cosocket siguen la convención de Lua: nil + una cadena de error en caso de fallo. Compruebe siempre ambos valores devueltos.

Limitaciones de los cosockets

Los cosockets no se pueden utilizar en: init_by_lua, set_by_lua, header_filter_by_lua. Utilícelos únicamente en las fases content, access y rewrite.

Comparación de rendimiento

Los cosockets alcanzan el mismo rendimiento que el código C basado directamente en epoll porque utilizan directamente la infraestructura de E/S de Nginx. No hay sobrecarga adicional de hilos ni procesos.

Pregunta sobre cosockets

¿Qué ocurre cuando un cosocket espera datos de un servidor lento?

Resumen: cosockets y TCP no bloqueante

Los cosockets de OpenResty proporcionan TCP/UDP no bloqueante y ceden la ejecución durante la E/S, lo que permite una alta concurrencia. Utilice setkeepalive para agrupar conexiones. Establezca tiempos de espera para evitar bloqueos. Solo están disponibles en las fases content/access/rewrite.

Preguntas frecuentes

¿La lección «Cosockets y TCP no bloqueante» es gratis?

Sí — el texto completo de «Cosockets y TCP no bloqueante» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Cosockets y TCP no bloqueante»?

Utilice ngx.socket.tcp para conexiones asíncronas con backends en content_by_lua. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Lua Academy?

No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Cosockets y TCP no bloqueante»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Lua Academy?

Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Arquitectura de OpenResty
  2. Gestión de solicitudes HTTP en Lua
  3. Cosockets y TCP no bloqueante
  4. Diccionarios de memoria compartida
← Volver a Lua Academy