Pergunta

Temos um aplicativo web baseado em Java EE em execução em um Peixe de vidro cluster de servidor de aplicativos. O tráfego recebido será principalmente solicitações RESTful para representações baseadas em XML de nossos recursos de aplicativos, mas talvez 5% do tráfego possa ser para representações baseadas em JSON ou XHTML/CSS.

Agora estamos investigando soluções de balanceamento de carga para distribuir o tráfego de entrada nas instâncias de vidro do cluster. Também estamos analisando como descarregar o cluster usando o Memcached, um mapa de hash distribuído na memória cujas chaves seriam os nomes de recursos restantes (por exemplo, "/usuário/bob", "/grupo/jazzlovers") e cujos valores são as representações XML correspondentes.

Uma abordagem que parece promissora é matar os dois pássaros com uma pedra e usar o leve, rápido nginx Servidor HTTP/proxy reverso. O Nginx lidaria com cada solicitação recebida, primeiro olhando seu URI em Memcached para ver se já existe uma representação XML não expirada lá. Caso contrário, o Nginx envia a solicitação para uma das instâncias de peixe -vidro. O módulo Nginx Memcached é descrito em Este pequeno artigo.

Qual é a sua impressão geral com o nginx e o memcached usado dessa maneira, quão feliz você está com eles? Quais recursos você achou mais útil para aprender sobre eles? Se você os experimentou e eles não se adequassem aos seus propósitos, por que não e o que você usou?

Nota: aqui está um Pergunta relacionada.

ATUALIZAÇÃO: Eu perguntei mais tarde A mesma pergunta no Serverfault.com. As respostas estão sugerindo principalmente alternativas ao Nginx (útil, mas indiretamente).

Foi útil?

Solução

Supondo que você tenha um banco de servidores de aplicativos a montante dados de entrega para os usuários.

upstream webservices {
    server 10.0.0.1:80;
    server 10.0.0.2:80;
    server 10.0.0.3:80;
}
server {
    ... default nginx stuff ...
    location /dynamic_content {
          memcached_pass localhost:11211;
          default_type   text/html;
          error_page     404 502 = @dynamic_content_cache_miss;
          set $memcached_key $uri;
    }
    location @dynamic_content_cache_miss {
          proxy_pass http://webservices;
    }

O que o snippet nginx.conf acima faz é direcionar todo o tráfego de http://example.com/dynamic/* Diretamente para o servidor memcached. Se o Memcache tiver o conteúdo, seus servidores upstream não verão nenhum tráfego.

Se o acerto do cache falhar com um erro 404 ou 502 (não em cache ou memcache não puder ser alcançado), o NGINX passará a solicitação para os servidores a montante. Como existem três servidores na definição upstream, você também obtém proxy de balanceamento de carga transparente.

Agora, a única advertência é que você deve garantir que seus servidores de aplicativos de back -end mantenham os dados no Memcache fresco. Eu uso o nginx + memcached + web.py para criar pequenos sistemas simples que lidam com milhares de solicitações por minuto em hardware relativamente modesto.

O código de pseudo -aplicativo geral para o servidor de aplicativos é assim para web.py

class some_page:
     def GET(self):
         output = 'Do normal page generation stuff'
         web_url = web.url().encode('ASCII')
         cache.set(web_url, str(output), seconds_to_cache_content)
         return output

As coisas importantes a serem lembradas no código web.py / pseudo acima são que o conteúdo proveniente de memcached via nginx não pode ser alterado. O nginx está usando strings simples e não unicode. Se você armazenar a saída Unicode no Memcached, você terá o mínimo de caracteres estranhos no início e no final do conteúdo em cache.

Eu uso o Nginx e o Memcached para um site relacionado a esportes, onde obtemos grandes pulsos de tráfego que duram apenas algumas horas. Eu não conseguia sobreviver sem o nginx e o memcached. A carga do servidor durante o último evento esportivo do último quarto de julho caiu de 70% para 0,6% após a implementação das alterações acima. Não posso recomendar o suficiente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top