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)
endEnvio 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)
endRecebimento 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 100Realizaçã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
endCosocket 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
- Arquitetura do OpenResty
- Tratamento de requisições HTTP em Lua
- Cosockets e TCP sem bloqueio
- Dicionários de memória compartilhada