[quote=tiagomac]Saudações amigos!!!
Referente a ambientes distribuídos e quanto a questão de programação, muito se fala sobre a utilização de stateless e stateful em ambiente corporativo tem-se adotado muito a utilização do stateful através de frameworks como jsf, gwt, wicket e outros… já na outra ponta estão as “startups” que tem aderido mais ao modelo stateless com frameworks como spring mvc, struts e outras linguagens hipistas que trazem esse conceito embutido em si.
Não querendo aqui discutir qual framework/linguagem é ou não, se jsf também pode ou não ser stateless, mas gostaria de tirar dúvida e discutir 2 itens:
1) O modelo stateless é realmente o mais indicado para distribuir o sistema entre “shards”,“cluster”,“grid”,“servidores”? e porque?
2) Se a utilização de sessão para salvar o estado do usuário destruir a possibilidade de distribuir o sistema entre servidores, então eu não deveria utilizar mais sessão? ou poderia serializar a sessão no banco para auxiliar no retorno do usuário ao site para momentos críticos como no caso de um “carrinho de compras”?
Resumindo, minha dúvida está em torno do uso da sessão em um ambiente stateless/distribuído…
Abraços![/quote]
Faça um exercício mental:
- Primeiro imagine um servidor com beans stateful (não interessa se são EJB’s, POJO’s gerenciados por JSF, whatever). Não há problema algum nesse ambiente.
- Visualize um ambiente com duas máquinas. Sticky sessions precisam ser configuradas para que as duas máquinas enxerguem a mesma sessão. A sessão precisa ser passada entre as máquinas para que não haja problemas (alguns sistemas também poderiam forçar o cliente a sempre enxergar a mesma máquina, mas isso seria um tiro no pé, já que perderia toda a noção de alta disponibilidade).
- Visualize um ambiente com mil máquinas. Estratégias mais avançadas precisam ser utilizadas para guardar a sessão num ambiente externo (por exemplo, um cluster memcached). A rede passa a ser muito onerada com o tráfego de dados.
- Visualize dois ou três datacenters, com mil máquinas cada… E ter sessões passa a ser impraticável.
Num ambiente stateless, não existe esse problema. Se você tem um carrinho de compras, por exemplo, esse carrinho pode ser passado sempre na requisição para o servidor. Claro, o tráfego de rede cliente/servidor ficaria um tanto pior, mas esse problema seria distribuído entre os clientes, de modo que os servidores não “abraçariam” a carga toda sozinhos. Só que, nesse ambiente, a escalabilidade dependeria apenas de colocar mais máquinas no cluster, tendendo a uma arquitetura conhecida como shared-nothing (na minha opinião, a melhor que existe).
Pra concluir… como você deve ter reparado pelo exercício mental, depende bastante do número de usuários que você possuir, mas em linhas gerais, sem estado é melhor do que com estado.
[]'s
P.S: Um adendo: cluster é uma coisa, grid é outra (parecida, mas diferente). Cluster é um conceito genérico, grid é mais específico e, em geral, é bom evitar grids e ter clusters.