Conexões de aceleração ao serviço da web se a carga ficar muito alta?

3

Eu tenho um site que se comunica via XMLRPC com um serviço da Web do servidor XMLRPC. (O serviço da web é escrito em Python usando xmlrpclib.) Acredito que o xmlrpclib irá bloquear enquanto está manipulando uma solicitação.

Portanto, se houver três usuários com uma solicitação xmlrpclib à sua frente, sua resposta será quatro vezes maior.

Como posso lidar com isso se eu receber muitas solicitações XMLRPC e o serviço da Web ficar atolado e tiver tempo de resposta lento?

Se eu estou recebendo slashdotted, meu comportamento preferido é que os primeiros usuários obtenham bons tempos de resposta e todos os outros recebam instruções para voltar mais tarde. Eu acho que isso é superior a dar a todos tempos de resposta terríveis.

Como eu crio esse comportamento? Isso é chamado de balanceamento de carga? Eu não estou realmente equilibrando, até que eu tenha vários servidores.

    
por Joseph Turian 02.12.2009 / 21:33

3 respostas

3

Bem, primeiro, existe uma maneira de você poder trabalhar novamente com o servidor XMLRPC para poder lidar com várias solicitações simultâneas? Ter várias sessões da Web dependem de um serviço que só pode fazer uma solicitação de cada vez, provavelmente, NÃO será feito para uso no mundo real. Um site corporativo interno com pouco tráfego pode se safar, mas no mundo real, de jeito nenhum.

Agora, dito isso, acho que você precisará fornecer um pouco mais de informações sobre a plataforma de serviços da Web para obter respostas que você possa usar. O melhor que posso dizer neste momento é 'contar as solicitações pendentes de XMLRPC no servidor web e falhar se houver muitas', mas isso é tão genérico a ponto de ser inútil.

    
por 02.12.2009 / 21:55
1

Você pode limitar a taxa de conexões usando iptables com uma declaração como:

iptables -A INPUT -p tcp --dport 22 -i ! vlan28 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

Como você pode ver, usamos isso para limitar a taxa em que as conexões ssh podem ser feitas para nossos servidores - mas alterando o número da porta ou outras variáveis você poderia usar isso para praticamente qualquer situação

    
por 02.12.2009 / 23:11
0

Você pode resolver isso colocando um proxy reverso na frente do servidor XMLPRC. O proxy reverso pode ser configurado para ter apenas uma conexão com o servidor XMLPRC e, apesar de ter um número máximo diferente de conexões possíveis que o público pode fazer para ele, digamos 10.

Por exemplo, um servidor Apache de backend pode ter MaxClients definido como "1", enquanto um proxy reverso Nginx de front-end pode definir limites de conexão para 10 clientes usando worker_processes e worker_connections.

Portanto, até 10 clientes podem se conectar ao proxy reverso, ser enfileirados até que o servidor XMLPRC esteja disponível (sujeito a algum valor de tempo limite). Se houver mais de 10 conexões ao mesmo tempo, o proxy reverso pode simplesmente não responder. Então, você provavelmente quer sintonizar que você pode enfileirar quantas conexões puder manipular responsavelmente.

Os detalhes dependem da implementação. Eu usei tanto o HAProxy quanto o Nginx como proxies reversos com sucesso, e acho o Nginx mais agradável de se trabalhar.

Também concordo com o feedback acima de que ser capaz de atender apenas a uma solicitação de cada vez no back-end parece ser um problema!

    
por 25.05.2012 / 22:24