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