Temos um aplicativo Web baseado em Java EE em execução em um cluster de servidores de aplicativos Glassfish . O tráfego de entrada será principalmente solicitações RESTful para representações baseadas em XML de nossos recursos de aplicativos, mas talvez 5% do tráfego seja 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 entre as instâncias do Glassfish no cluster. Também estamos examinando como descarregar o cluster usando o memcached, um mapa de hash distribuído na memória cujas chaves seriam os nomes dos recursos REST (por exemplo, "/ user / bob", "/ group / jazzlovers") e cujos valores são as representações XML correspondentes.
Uma abordagem que parece promissora é matar os dois pássaros com uma cajadada e usar o servidor HTTP nginx leve e rápido / proxy reverso. O Nginx lidaria com cada solicitação recebida, primeiro procurando seu URI no memcached para verificar se já existe uma representação XML não expirada. Caso contrário, o nginx envia a solicitação para uma das instâncias do Glassfish. O módulo nginx memcached é descrito neste pequeno resumo .
Qual é a sua impressão geral com o nginx e o memcached usados dessa maneira, quão feliz você está com eles? Quais recursos você achou mais útil para aprender sobre eles? Se você as experimentou e elas não atendiam aos seus propósitos, por que não e o que você usou?
Nota: aqui está uma pergunta relacionada . Antes que eu soubesse sobre o ServerFault, perguntei isso no StackOverflow .
Edit: Todas as respostas aqui até agora foram bastante úteis, embora não houvesse experiência direta. Essa resposta acabou aparecendo no StackOverflow e foi bastante otimista na configuração do nginx / memcached.
Respostas:
Você realmente deve usar um servidor de cache na frente de seus servidores web. Eu recomendo o Varnish-cache. Nós o usamos no trabalho com o maior e mais movimentado site da Escandinávia. Substituímos 13 caixas de lulas altamente carregadas por uma caixa de verniz e uma de reposição.
Comparei um aplicativo simples no meu site privado e passou de 9 solicitações por segundo para mais de 2000.
Você decide por quanto tempo as coisas ficam na memória, pode fazer até o final dos tempos e depois enviar uma solicitação de limpeza http ao servidor de cache quando os dados forem alterados.
fonte
Minha opinião pessoal, por experiência própria, é que, se você estiver usando um balanceador de carga, deseja limitar essa caixa inteiramente às funções de balanceamento de carga. O fato de o seu balanceador de carga exibir conteúdo, mesmo de um cache, diminui a funcionalidade de balanceamento de carga em situações de alta carga (mais conexões permanecem ativas por mais tempo, reduzindo a capacidade e a taxa de transferência gerais).
Aconselho que o próprio aplicativo faça a pesquisa e sirva o conteúdo em cache e permita que o balanceador de carga faça seu trabalho. Dito isso, o nginx não é perfeito no que diz respeito ao balanceamento de carga - ele oferece apenas um algoritmo round-robin muito básico. Eu recomendaria haproxy. Se você precisa de serviços de descriptografia SSL na frente, o nginx funciona bem na frente do haproxy, na minha experiência.
fonte
Eu acho que você chegará a um beco sem saída, caso precise de coisas como balanceamento de carga, alta disponibilidade e etc.
Além disso, considere essa situação: quando a página de autenticação do usuário tiver uma aparência diferente, com recursos adicionais disponíveis e individualizados para cada usuário. Os URLs são os mesmos para conveniência de vinculação e etc. Por exemplo, o site em que o usuário autenticado não precisa digitar seu nome / captcha para comentários ou o site exibe seu nome de usuário no topo, quando você está logado (como falha do servidor). Nesses casos, o nginx será inutilizável, porque você não pode distinguir usuário autenticado e não autenticado.
Se você não precisa de SSL, sugiro que você execute o Varnish. Ele foi projetado como acelerador HTTP, não como servidor da web ou proxy. Se você precisar de SSL, execute nginx na parte superior como acelerador SSL e envernize como acelerador HTTP simples, porque o Varnish não pode lidar com SSL.
Acho que a escolha do servidor de armazenamento em cache é específica do aplicativo e você não pode fazer comentários generalizados sobre isso sem uma análise aprofundada do aplicativo.
fonte
minha escolha é haproxy. Proxy reverso muito pequeno e muito rápido, mas não é proxy de cache! Eu uso no meu sistema de cache "Squid Web Proxy"
Este trabalho perfeito para o meu sistema web
fonte