cosocket é a base para várias bibliotecas sem bloqueio lua-resty-*
cosocket = co-rotina + soquete
Ele precisa do suporte do recurso de co-rotina Lua e do mecanismo de evento Nginx. Os dois são combinados para obter E/S de rede sem bloqueio.
Ao encontrar E/S de rede, ele entregará o direito de controle, registrará o evento de rede na lista de monitoramento Nginx e entregará a autoridade ao Nginx; quando um evento Nginx atingir a condição de acionamento, ele ativará a co-rotina correspondente para continuar processando.
API co-socket
APIs relacionadas a TCP
- criar objeto
ngx.socket.tcp
- definir tempo limite
tcpsock:settimeout
etcpsock:settimeouts
- estabelecer conexão
tcpsock:connect
- enviar dados
tcpsock:send
- receber dados
tcpsock:receive
etcpsock:receiveany
tcpsock:receiveuntil
- pool de conexões
tcpsock:setkeepalive
- estreita conexão
tcpsock:close
Devido às limitações do kernel Nginx, a API cosocket não pode ser usada nos estágios de set_by_lua , log_by_lua , header_filter_by_lua*, init_by_lua*, init_worker_by_lua* e body_filter_by_lua*. **
Instruções Nginx relacionadas à API acima
lua_socket_connect_timeout
Tempo limite de conexão, padrão 60slua_socket_send_timeout
Tempo limite de envio, padrão 60slua_socket_send_lowat
limite de envio, padrão 0lua_socket_read_timeout
Tempo limite de leitura, padrão 60slua_socket_buffer_size
Tamanho do buffer para leitura de dados, padrão 4k/8klua_socket_pool_size
Tamanho do pool de conexão, padrão 30lua_socket_keepalive_timeout
O tempo ocioso do objeto cosocket do pool de conexões, o padrão é 60slua_socket_log_errors
Se deve gravar um log quando cosocket tem um erro, o padrão é não
Quando uma diretiva entra em conflito com uma API, a API substitui a diretiva.
$ resty -e 'local sock = ngx.socket.tcp()
sock:settimeout(1000) -- one second timeout
local ok, err = sock:connect("www.baidu.com", 80)
if not ok then
ngx.say("failed to connect: ", err)
return
end
local req_data = "GET / HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n"
local bytes, err = sock:send(req_data)
if err then
ngx.say("failed to send: ", err)
return
end
local data, err, partial = sock:receive()
if err then
ngx.say("failed to receive: ", err)
return
end
sock:close()
ngx.say("response is: ", data)'
ngx.socket.tcp()
Crie um objeto cosocket TCP chamado sock porsettimeout()
Definir o tempo limite para 1sconnect()
Estabeleça uma conexão TCP com o site especificado- Se a conexão for bem-sucedida, ele é usado
send()
para enviar dados e, se o envio falhar, ele sai - Se o envio for bem-sucedido, ele é usado
receive()
para receber os dados retornados pelo site - A última chamada para
close()
fechar ativamente a conexão TCP
uso do pool de conexões
- Não coloque a conexão errada no pool de conexões, caso contrário, isso levará à falha de envio e recebimento de dados no próximo uso (você precisa avaliar se cada chamada de API foi bem-sucedida com antecedência)
- Para descobrir os dados de conexão, o pool de conexões está no nível do trabalhador