Atualmente, estou usando o nginx para solicitações de proxy reverso de clientes da web que estão fazendo sondagens longas para um desenvolvedor.
Como estamos fazendo uma pesquisa longa (em oposição a websockets), quando um cliente se conecta, ele fará várias conexões http com o servidor em série, restabelecendo uma conexão toda vez que o servidor enviar alguns dados (ou expirar o tempo limite) e restabelecer se o servidor não tem nada a dizer por 10 segundos).
O que eu gostaria de fazer é limitar o número de clientes da Web simultâneos. Como os clientes estão constantemente fazendo novas solicitações HTTP em vez de manter uma única solicitação aberta, é um pouco complicado contar o número total de clientes da web (porque não é o mesmo que o número total de clientes http conectados simultaneamente).
O método que desenvolvi é rastrear solicitações http pelo endereço IP de origem e armazenar o endereço IP em algum lugar com um TTL de 20 segundos. Se uma solicitação chegar em cujo IP não é reconhecido, verificaremos o número total de endereços IP armazenados não expirados; se isso for menor que o máximo, então permitimos que essa solicitação seja feita. E se uma solicitação chegar com um endereço IP que possamos encontrar na tabela de consulta que ainda não expirou, ela também será permitida. Todas as solicitações permitidas têm seus IPs adicionados à tabela (se não houver antes) e o TTL é atualizado novamente para 20 segundos.
Na verdade, eu tinha juntado algo que funcionava corretamente dessa forma usando o nginx junto com o módulo Redis 2.0 Nginx ( e o módulo nginx lua para simplificar a ramificação condicional), usando redis para armazenar meus endereços IP com um TTL (o comando SETEX
) e verificando o tamanho da tabela com o comando DBSIZE
.
Isso funcionou, mas o desempenho foi horrível. O nginx e o redis acabaram usando muita cpu e a máquina só conseguiu lidar com um número muito pequeno de solicitações simultâneas.
Os novos stick-table
e contadores de rastreamento que foram adicionados ao Haproxy na versão 1.5 (por meio de uma comissão do serverfault ) parece que eles podem ser ideais para implementar exatamente esse tipo de limitação de taxa, porque a tabela-pau pode rastrear endereços IP e expirar entradas automaticamente. No entanto, não vejo uma maneira fácil de obter uma contagem total das entradas não expiradas na tabela, o que seria necessário para saber o número de clientes da Web conectados.
Estou curioso para saber se alguém tem alguma sugestão, para nginx ou haproxy ou mesmo para outra coisa que não tenha sido mencionada aqui e em que ainda não tenha pensado.