0Pricing
Lua Academy · Aula

Cosockets e TCP sem bloqueio

Use ngx.socket.tcp para conexões assíncronas com serviços de back-end em content_by_lua.

Cosockets e TCP sem bloqueio é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.

O que são cosockets?

Os cosockets do OpenResty são soquetes TCP/UDP não bloqueantes que se integram ao loop de eventos do Nginx. Ao aguardar dados, eles cedem o controle da corrotina, liberando o processo de trabalho para lidar com outras solicitações.

Criação de um cosocket TCP

Use ngx.socket.tcp() para criar um cosocket. As operações de conexão, envio e recebimento cedem o controle automaticamente quando a E/S bloquearia a execução.

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

Envio de dados

sock:send(data) envia uma string. Retorna o número de bytes enviados ou nil + um erro.

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

Recebimento de dados

sock:receive(pattern) lê dados. Padrões: "*l" lê uma linha, "*a" lê tudo até o fechamento, e um número lê exatamente 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)

Definição de tempos limite

Defina tempos limite para conexão, envio e recebimento a fim de evitar esperas indefinidas.

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

Pool de conexões

sock:setkeepalive(timeout, pool_size) devolve o soquete a um pool para reutilização. Isso é essencial para o desempenho do Redis/MySQL.

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

Realização de uma solicitação HTTP

Implemente uma solicitação HTTP/1.0 GET simples usando um 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() cria um cosocket UDP. É útil para o envio de métricas ao statsd.

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

Padrão de tratamento de erros

Todos os métodos de cosocket seguem a convenção do Lua: nil + uma string de erro em caso de falha. Sempre verifique os dois valores retornados.

Limitações dos cosockets

Os cosockets não podem ser usados em: init_by_lua, set_by_lua, header_filter_by_lua. Use-os somente nas fases de conteúdo, acesso e reescrita.

Comparação de desempenho

Os cosockets alcançam a mesma vazão que o código C baseado diretamente em epoll, pois usam diretamente a infraestrutura de E/S do Nginx. Não há sobrecarga adicional de threads ou processos.

Pergunta sobre cosockets

O que acontece quando um cosocket está aguardando dados de um servidor lento?

Recapitulação: cosockets e TCP não bloqueante

Os cosockets do OpenResty fornecem TCP/UDP não bloqueante e cedem o controle durante a E/S, possibilitando alta simultaneidade. Use setkeepalive para agrupar conexões. Defina tempos limite para evitar esperas indefinidas. Eles só estão disponíveis nas fases de conteúdo, acesso e reescrita.

Perguntas Frequentes

A aula “Cosockets e TCP sem bloqueio” é grátis?

Sim — o texto completo de “Cosockets e TCP sem bloqueio” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.

O que vou aprender em “Cosockets e TCP sem bloqueio”?

Use ngx.socket.tcp para conexões assíncronas com serviços de back-end em content_by_lua. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Lua Academy?

Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Cosockets e TCP sem bloqueio”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Lua Academy?

Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Arquitetura do OpenResty
  2. Tratamento de requisições HTTP em Lua
  3. Cosockets e TCP sem bloqueio
  4. Dicionários de memória compartilhada
← Voltar para Lua Academy