Como você pode configurar o nginx para impedir o bloqueio em um serviço de back-end do uwsgi lento?

1

Digamos que eu tenha uma configuração simples do nginx que converse com um back-end do uwsgi:

server {
    listen 9900 default_server;
    listen [::]:9900 default_server;
    location / {
            include         uwsgi_params;
            uwsgi_pass      unix:/tmp/service-foo.sock;
    }
}

Esse serviço tem um certo subconjunto de URLs ( /renderer/... ) que são sempre muito lentas e, sob carga pesada, o site inteiro fica inativo.

O que eu quero é substituir isso por duas cópias do backend, assim:

server {
    listen 9900 default_server;
    listen [::]:9900 default_server;

    location / {
            include         uwsgi_params;
            uwsgi_pass      unix:/tmp/service-foo.sock;
    }
    location ~ ^/renderer/[0-9]+/ {
            include         uwsgi_params;
            uwsgi_pass      unix:/tmp/service-renderer.sock;
            uwsgi_read_timeout      30s;
            uwsgi_send_timeout      30s;
            uwsgi_request_buffering on;
    }
}

... minha expectativa ingênua era de que isso solucionaria o problema, permitindo que as solicitações /renderer/... fossem atendidas lentamente, uma de cada vez, enquanto o restante do site permanecesse responsivo.

No entanto, não funcionou.

Parece que o nginx está atendendo pedidos em ambos os locais do mesmo processo e, eventualmente, o servidor apenas bloqueia com todas as solicitações na segunda instância do uwsgi, e o primeiro exemplo do uwsgi não faz nada.

Eu li sobre a diretiva nginx thread_pool que parece quase exatamente o que eu quero (ou seja, um conjunto de threads reservado específico para a localização do renderizador), mas isso não parece ser suportado pelo uwsgi, é apenas para arquivo io.

Existe alguma maneira de fazer o que eu quero no nível nginx?

    
por Doug 28.06.2017 / 06:12

0 respostas

Tags