Site para suportar milhares de acessos diariamente

Bem pessoal,

Estou estudando uma forma de desenvolver uma arquitetura “ideal” para manter sites de grande porte distribuídos(Entenda grande porte como sites do tipo como o terra, o uol, o mercadolivre, guj, e etc… que tem milhares de pessoas utilizando…) em java e como não tenho experiência em todos os assuntos que serão mencionados futuramente neste tópico, gostaria de saber sobre a experiência/opinião de todos vocês sobre os *recursos(arquiteturas, técnicas de programação, framework’s, ferramentas, programas, servidores(hardware e software), e etc) que poderão ser utilizados para desenvolver/hospedar um site desse porte. Então vamos lá… O que é preciso fazer/programar/desenvolver/implementar/etc para garantir que o site seja performático, escalável, que tenha compatibilidade entre inúmeros browsers, que permita balanceamento de carga, replicação de banco de dados, servidores dedicados apenas para guardar as sessões(balanceando e replicando) dos usuários, que permita internacionalização…, enfim, um site que fique no ar o “tempo todo” e que responda as requisições com rapidez?

*É aconselhável que os “recursos” sejam gratuitos, até por que no final dos estudos, vamos montar e disponibilizar aqui no guj, a arquitetura “ideal”(baseada na experiência e nos estudos de todos nós) para hospedar sites desse porte.

Lá vai minha opinião… Creio que para garantir uma melhor perfórmance do site é preciso programar utilizando JSP/JSTL/SERVLETS/HTML/Tableless/JQUERY(É o mais aconselhável para garantir a compatibilidade entre os browsers?), pois assim temos um maior controle de como a view está funcionando. Pensei também em utilizar o apache, postgresql…

Obs.: Seria interessante mencionar os assuntos que serão explanados na resposta, no tópico da resposta(na parte assunto), pois desta forma qualquer pessoa que venha a ler a mesma, saberá de imediato o assunto que será tratado.

Cara se eu não me engano vc quer criar um cms certo?

Tipo esse: http://www.opencms.org/en/

flwsss

Não é bem um CMS que nós pretendemos fazer, mas a arquitetura vai atender qualquer tipo de sistema(tanto de pequeno como de grande porte) web em java.

Que servidor de aplicação você aconselharia utilizar?

[quote=danbrasileiro]Bem pessoal,

Estou estudando uma forma de desenvolver uma arquitetura “ideal” para manter sites de grande porte distribuídos(Entenda grande porte como sites do tipo como o terra, o uol, o mercadolivre, guj, e etc… que tem milhares de pessoas utilizando…) em java e como não tenho experiência em todos os assuntos que serão mencionados futuramente neste tópico, gostaria de saber sobre a experiência/opinião de todos vocês sobre os *recursos(arquiteturas, técnicas de programação, framework’s, ferramentas, programas, servidores(hardware e software), e etc) que poderão ser utilizados para desenvolver/hospedar um site desse porte. Então vamos lá… O que é preciso fazer/programar/desenvolver/implementar/etc para garantir que o site seja performático, escalável, que tenha compatibilidade entre inúmeros browsers, que permita balanceamento de carga, replicação de banco de dados, servidores dedicados apenas para guardar as sessões(balanceando e replicando) dos usuários, que permita internacionalização…, enfim, um site que fique no ar o “tempo todo” e que responda as requisições com rapidez?
[/quote]

Esses requisitos não significam nada sem medidas. O que significa “rapidez” , “performático” , “escalável”, “inumeros” ?
não chute , avalie. Quantos e quais browsers ? IE, FireFox , Opera, Safari , etc… Escolha os que lhe interessam, pense no seu usuario tipico.
A requisição têm que ser entregue em quanto tempo máximo ? 1s , 3s ? está contando com a latência da rede ?
Escalável ? Quantos usuários deve suportar para começar a funcionar ? Se o uso aumentar em 1000 usuários como isso afeta os numeros dos outros requisitos. ( por exemplo, se 1000 usuario causam um atraso suplementar de 1s por requisição de usuário que estava em 2 e tem máximo em 5, então o sistema suporta 1000 usuários extra sem aumento de hardware. )

Requisitos não-funcionais como estes têm que ser especificados em medidas. Vc pode usar ferramentas como o JMeter para medir e ver se está dentro dos parametros. Ganhos são feitos utilizando máquinas mais potentes e/ou clustering. Clustering depende do AS logo escolha um que suporte clustering. Faça a aplicação independentemente do AS e teste em vários. Escolha o que mais se comportar dentros dos numeros. Se necessários otimize depois que escolher os AS que lhe interessam.

Melhores indices de qualidade significa mais custo. Tenha cuidado com os índices que escolher porque pode não conseguir cumprir.
Sempre se refira a estes indices com números. E esses números devem ser mensurados com base em uma especificação ( ou seja, não pode medir à toa), caso contrario eles não têm significado.

Use OO. Muito OO para ter flexibilidade nas otimizações futuras. Se não usou suficiente, refactoring.

[quote=sergiotaborda][quote=danbrasileiro]Bem pessoal,

Estou estudando uma forma de desenvolver uma arquitetura “ideal” para manter sites de grande porte distribuídos(Entenda grande porte como sites do tipo como o terra, o uol, o mercadolivre, guj, e etc… que tem milhares de pessoas utilizando…) em java e como não tenho experiência em todos os assuntos que serão mencionados futuramente neste tópico, gostaria de saber sobre a experiência/opinião de todos vocês sobre os *recursos(arquiteturas, técnicas de programação, framework’s, ferramentas, programas, servidores(hardware e software), e etc) que poderão ser utilizados para desenvolver/hospedar um site desse porte. Então vamos lá… O que é preciso fazer/programar/desenvolver/implementar/etc para garantir que o site seja performático, escalável, que tenha compatibilidade entre inúmeros browsers, que permita balanceamento de carga, replicação de banco de dados, servidores dedicados apenas para guardar as sessões(balanceando e replicando) dos usuários, que permita internacionalização…, enfim, um site que fique no ar o “tempo todo” e que responda as requisições com rapidez?
[/quote]

Esses requisitos não significam nada sem medidas. O que significa “rapidez” , “performático” , “escalável”, “inumeros” ?
não chute , avalie. Quantos e quais browsers ? IE, FireFox , Opera, Safari , etc… Escolha os que lhe interessam, pense no seu usuario tipico.
A requisição têm que ser entregue em quanto tempo máximo ? 1s , 3s ? está contando com a latência da rede ?
Escalável ? Quantos usuários deve suportar para começar a funcionar ? Se o uso aumentar em 1000 usuários como isso afeta os numeros dos outros requisitos. ( por exemplo, se 1000 usuario causam um atraso suplementar de 1s por requisição de usuário que estava em 2 e tem máximo em 5, então o sistema suporta 1000 usuários extra sem aumento de hardware. )

Requisitos não-funcionais como estes têm que ser especificados em medidas. Vc pode usar ferramentas como o JMeter para medir e ver se está dentro dos parametros. Ganhos são feitos utilizando máquinas mais potentes e/ou clustering. Clustering depende do AS logo escolha um que suporte clustering. Faça a aplicação independentemente do AS e teste em vários. Escolha o que mais se comportar dentros dos numeros. Se necessários otimize depois que escolher os AS que lhe interessam.

Melhores indices de qualidade significa mais custo. Tenha cuidado com os índices que escolher porque pode não conseguir cumprir.
Sempre se refira a estes indices com números. E esses números devem ser mensurados com base em uma especificação ( ou seja, não pode medir à toa), caso contrario eles não têm significado.

Use OO. Muito OO para ter flexibilidade nas otimizações futuras. Se não usou suficiente, refactoring. [/quote]

Mandou bem sergiotaborda.

De nada vale você querer desenvolver uma aplicação megapotente sem conhecer exatamente seu escopo e suas métricas.
Você provavelmente vai criar um canhão parra matar uma mosca, ou, o que é pior, criar uma ferramente que não atenda a demanda.
Defina o escopo primeiro. Depois pense na arquitetura.

Se você já tem o escopo e seus indicadores definidos, talvez possa postar no GUJ para que os usuário possam contribuir.

Browsers: IE, FireFox , Opera, Safari.
A requisição tem que ser entregue no máximo em 5 segundos, já contando com a latência da rede.
Inicialmente eu quero que o site suporte 2000 usuários simultaneamente, mas eu quero ver a possibilidade de estender essa quantidade de acordo com o aumento de visitas ao site. (Futuramente eu vou precisar utilizar clusters.) O jetty seria o mais aconselhável para rodar uma aplicação feita com JSP/JSTL/SERVLETS/HTML/Tableless/JQUERY? É possível fazer a replicação da sessão dos usuários em clusters do Jetty? Enfim, o que é o mais aconselhável para desenvolver um site deste porte?

Sr. danbrasileiro,

Se entendi direito, vc quer montar uma arquitetura que aguente uma grande quantidade de conexões e tê-la como "padrão" para qualquer aplicação que surgir, se isso for verdade acredito que deva estar havendo algum equivoco sobre a idéia da tecnologia Java.
A tecnologia Java, juntamente com a orientação a objetos (como foi bem mencionado pelo nosso amigo [b]Sr. Sergio Taborda[/b]) tem como ponto forte justamente a condição de vc poder APLICAR AJUSTES NA SUA ARQUITETURA caso ela não esteja atendendo mais os requisitos propostos inicialmente com o mínimo de impacto possível.
Vc citou o site do GUJ como exemplo, muito bem...recentimente (segundo informações do próprio forum) foi trocado o servidor de aplicação; acho que trocaram o TOMCAT pelo JETTY por questões relacionados a performance (alguem me corrija se eu estiver errado). Acredite, se a equipe soubesse logo no início que o SA anterior ao JETTY não suportaria eles teriam colocado o JETTY logo de saida (quero acreditar nisso rsrsrs).
O que estou tentando dizer é que: Por mais que vc obtenha medidas e faça previsões havera momentos que vc tera que ajustar algumas coisas, logo é nesse ponto que temos que aplicar grande esforço porque acredite, ajustes/adaptações em sistemas é uma constante e é nesse ponto que a tecnologia Java tem bastante a contribuir.

Portanto acho que se vc não apresentar um contexto um pouco mais delineado vai ser difícil o pessoal lhe dar algumas dicas; porque pouca gente se motiva a dar soluções para problemas que, vamos dizer assim, não existem ainda.

Ano passado fiz algumas manutenções em um sistema na AES de São Paulo, o sistema de atendimento ao público nos casos de emergência e outros problemas; a questão com este sistema é que quando chove forte boa parte da cidade liga para falar de problemas relacionados a chuva (arvores caidas, fios desconectados etc...) são centenas de ligações. A arquitetura éra bem simples, foi utilizado 2 máquinas com 2 gigas de memória (clasterizadas), um balancer "fisico", o TOMCAT, JSP, javascript, Servlets e o banco de dados Oracle. O código tinha bastante problemas na sua escrita, quem escreveu não sabia quase nada de arquitetura, mas enfim...o sistema dava conta do recado tranquilamente, depois de vários ajustes no código obviamente, mas a arquitetura continua a mesma não aumentou e nem diminuiu.
Resumindo, com o que vc citou JSP/JSTL/SERVLETS/HTML/Tableless/JQUERY + OOP e um bom banco de dados bem configurado com pool de conexões etc... vc já vai estar com uma arquitetura que aguentara vários tipos de sistemas.

[]'s

Poderia descrever sobre esse balancer “físico”?

Não tem mistério.

Load balance.

Um bom tunning de banco, com índices apropriados. (Sem mistério tb…)

Cache para o banco de dados.

Se precisar de fail-over use um cache distribuído: http://recipes.mentaframework.org/posts/list/42.page

O gargalo geralmente acontece no banco de dados. Há soluções de cluster de banco, só que não são simples nem baratas. Acho que o MySQL já oferece isso…

Agora com certeza haverá empresas e pessoas que vão querer complicar isso ao extremo…

Olá

Também gostei do que o Taborda escreveu. Só vou complementar com 3 regrinhas básicas:

  1. Não existe bala de prata

  2. Não existe uma fórmula que atenda todos os casos

  3. Não existe uma arquitetura “ideal”

Umas dicas de leitura:

Poeria sugerir outros links até melhores mas não deixe de ver isto aqui:
http://www.docstoc.com/docs/1739741/Frank-Mashraqi-Scalability-for-Startups-How-to-Grow-Up-without-Blowing-Up

[]s
Luca

http://www.guj.com.br/posts/list/93297.java

se é um projeto web, e tem mesmo milhares de acessos.

pode usar os serviços da Akamai, é o que os grandes portais usam, inclusive os grandes eventos com stream tb usam isto.

se não me engano, o google, microsoft, yahoo, etc, são clientes deles, nestes casos pra que ter a infraestrutura toda se já tem quem tenha?

basicamente o q a Akamai faz é ter servidores espalhados por todos os paises, fazendo de proxy nacional, e sincronizando toda a informação.

quando portugal ficou com a presidencia da UE (participei do projeto) foi usado o serviço da Akamai para aguentar com os acessos, sei que não é caro e nem complicado. no desenvolvimento não foi preciso fazer nada, foi só configuração de DNS.