H2o: Atraso ausente (sleep, Thread.sleep) em mruby?

Criado em 2 mai. 2017  ·  6Comentários  ·  Fonte: h2o/h2o

Eu escrevi um manipulador mruby que usa http_request para manter meu cache atualizado no wordpress, mas como não conheço nenhuma maneira de suspender o manipulador e ele faz muitas solicitações, ele falha na solicitação porque o php não consegue acompanhar.

Existe alguma maneira de dormir por alguns segundos em h2o usando mruby (eu tentei instalar a extensão mruby de thread customizada, mas não consigo obter a data de resposta fora do thread)?

O erro:
[lib/handler/fastcgi.c] in request:/index.php/tag/science:connection failed:failed to connect to host

O código:

if request_is_from_self and links_file_exist and req_is_get
    links = `php #{links_filepath}`

    for link in links.split(' ') do
        req = http_request(link)
        _, _, _ = req.join
    end
end
enhancement mruby

Todos 6 comentários

oi @taosx
Eu duvido que seja realmente um php que não consegue acompanhar.
você está enviando solicitações de http para a própria instância do h2o que, em seguida, executa o fastcgi?

Não tenho certeza se você fez isso intencionalmente para emular as pausas, mas pelo que li, você participa de todas as solicitações sequencialmente. A ideia seria que as solicitações saíssem em paralelo, de modo que você só comece a ingressar depois que todas as solicitações forem disparadas.

você pode tentar algo como

links.split(' ').map{|l| http_request }.to_a.map{|r| r.join}

e postar uma descrição mais detalhada do erro?

Além disso, se forem sempre os mesmos poucos links e eles forem mais ou menos estáticos, você poderá implementar rapidamente um cache de memória barato.

Acredito que seu código não está fornecendo um argumento para http_request, eu modifiquei assim:
links.split(' ').map{|l| http_request(l) }.map{|r| r.join}
mas ainda parece ter um desempenho pior do que o código que postei acima.
Resolvi a solução instalando e ativando o opcache para php e agora o tempo que leva para fazer todas as solicitações caiu de 27 segundos para 3,1 segundos sem erros. Usando seu código vai para 4 segundos.

Depois de fazer mais alguns testes, gostaria de abrir o código-fonte de todo o código do meu site wordpress com h2o, que armazena páginas em cache a cada 2 minutos, pré-comprime com gzip e brottli nas configurações máximas e serve a partir do cache. Amo a água até agora, agradeço a todos os contribuidores da água !!

No futuro, adoraria ver mais recursos de script para h2o, como o openresty, mas baseado em h2o: D

@taosx ah desculpe. esqueci a parte crucial: .to_a

links.split(' ').map{|l| http_request }.to_a.map{|r| r.join}

só por curiosidade, pode tentar de novo. e quantas solicitações você faz / quão grande é a matriz de links?

@yannick Eu tentei novamente, tive que modificar http_request para fornecer seu argumento (l).
A velocidade caiu para 3,06 segundos: D e às vezes 2,9+ quando aquecido o cache.
A matriz de links possui 41 elementos (aws ec2 t2.micro).

Sempre que adiciono outra postagem, recebo 1 link da própria postagem + ~ 5 links de tags adicionadas ...
Acho que terei um pequeno problema no futuro próximo. Acho que vou largar o mruby por enquanto e buscar uma abordagem diferente no futuro.

Você acha que eu poderia usar h2o com mruby como um cache de proxy reverso para wp, eu acredito que é possível.

parece que você paga para php através de links = php #{links_filepath} . provavelmente muito lento, você removeu aquele tempo?
para apenas h2o, o t2.micro deve funcionar, mas se você também executar o php nessa máquina, eles competem pela única cpu e o desempenho cai ainda mais. então, pelo menos para o teste, eu pegaria algo como um c4.large ou c4.xlarge.

sim, o armazenamento em cache via mruby deve ser possível, ou você faz isso na memória ou usa o redis (que atualmente ainda precisa de um patch, mas deve ser mesclado em breve, consulte https://github.com/h2o/h2o/pull/1152)

Esta é uma discussão interessante!

Além de como o problema deve ser resolvido (por exemplo, implementando um cache usando mruby), acredito que não há razão para não fornecermos uma função de suspensão em nosso manipulador mruby.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Jxck picture Jxck  ·  7Comentários

utrenkner picture utrenkner  ·  8Comentários

proyb6 picture proyb6  ·  5Comentários

utrenkner picture utrenkner  ·  5Comentários

Ys88 picture Ys88  ·  5Comentários