Co-socket OpenResty

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 objetongx.socket.tcp
  • definir tempo limite tcpsock:settimeoutetcpsock:settimeouts
  • estabelecer conexãotcpsock:connect
  • enviar dadostcpsock:send
  • receber dados tcpsock:receiveetcpsock:receiveanytcpsock:receiveuntil
  • pool de conexõestcpsock:setkeepalive
  • estreita conexãotcpsock: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_timeoutTempo limite de conexão, padrão 60s
  • lua_socket_send_timeoutTempo limite de envio, padrão 60s
  • lua_socket_send_lowatlimite de envio, padrão 0
  • lua_socket_read_timeoutTempo limite de leitura, padrão 60s
  • lua_socket_buffer_sizeTamanho do buffer para leitura de dados, padrão 4k/8k
  • lua_socket_pool_sizeTamanho do pool de conexão, padrão 30
  • lua_socket_keepalive_timeoutO tempo ocioso do objeto cosocket do pool de conexões, o padrão é 60s
  • lua_socket_log_errorsSe 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)'
  1. ngx.socket.tcp()Crie um objeto cosocket TCP chamado sock por
  2. settimeout()Definir o tempo limite para 1s
  3. connect()Estabeleça uma conexão TCP com o site especificado
  4. Se a conexão for bem-sucedida, ele é usado send()para enviar dados e, se o envio falhar, ele sai
  5. Se o envio for bem-sucedido, ele é usado receive()para receber os dados retornados pelo site
  6. 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

Supongo que te gusta

Origin blog.csdn.net/weixin_44388689/article/details/131509451
Recomendado
Clasificación