Olá pessoal … Estou com problemas arquiteturais em um sistema legado e preciso de ajuda.
Tenho um sistema JavaEE desenvolvido com JSF 2.2 + Primefaces que atualmente roda no Glassfish. Nesse sistema deve haver um chat e um esquema de notificações (como no facebook, onde há notificações a cada nova informação que chega). No caso do chat, as mensagens enviadas e recebidas devem aparecer automaticamente na tela (sem que o usuário precise atualizá-la), como no facebook. O mesmo deve ocorrer com as notificações, onde devem haver chamadas ao servidor buscando por novas atualizações.
O chat já foi desenvolvido, porém de um modo errôneo, ou seja, para que as mensagens apareçam automaticamente, usou-se o componente Poll do Primefaces, onde há cada 5 segundos há uma chamada ao servidor que retorna as novas mensagens, mostrando-as na tela.
A parte de notificações iria ocorrer da mesma forma colocando-se o Poll no template.xhtml do sistema, mas devido o grande número de problemas com o Poll do chat, optou-se por não ir a diante com esta “gambiarra”.
Bom pessoal, obviamente eu e meus colegas não temos muita experiência. Eu gostaria que vcs me indicassem soluções arquiteturais que possam resolver este problema de chamadas assíncronas no servidor de modo que este não fique muito sobrecarregado. O que puderem me passar, eu agradeço.
“JSF, Primefaces e Glassfish” para aplicações em tempo real, com chamadas ao servidor de cinco em cinco segundos, é o mesmo que construir um telhado usando estaca de madeira no lugar de prego e tijolo no lugar de martelo. Acho que a maioria que usa esse tipo de arquitetura, são pessoas que ainda estão bem ‘cruas’ com projetos web e programação(eu mesmo no inicio ia usar essa arquitetura assim como você). Tipo, pra usar JSF é só quando não querem gastar um pouco mais de tempo programando no ‘bruto’(o que lhe da mais flexibilidade como vantagem), ou então, é quando a pessoa só aprendeu JSF e achou que é a melhor arquitetura.
No seu caso, assim como o meu projeto atual, a melhor arquitetura que encontrei para aplicações em tempo real e que é assíncrona por natureza, é usando javascript, com um banco NoSQL, e com um servidor de aplicação muito mais rápido que Glassfish, Tomcat e Apache. Mais precisamente você não usaria nada de JAVA, usaria a plataforma Node JS(usa a linguagem javascript), pode escolher qualquer banco NoSQL, pois todos foram projetados para serem rápidos, mas para mais facilidade no inicio, o MongoDB é para NoSQL, o que o MySQL é para os SGBDR. Para mais velocidade ainda em tempo real, você pode usar dois bancos NoSQL. Um que armazena no disco, e outro chave/valor que armazena conteúdo muito acessado no cache da memória RAM. E no lugar do Glassfish, você pode usar o litespeed, que é o mesmo que o youtube usa, ou então o Nginx que dizem ser mais veloz que o litespeed. Eu mesmo vou usar o Nginx, pois vários testes que fiz com ele e pela experiencia que estou adquirindo, ele ganha de longe dos outros que eu já usei, que era o Tomcat, Jboss e Glassfish.
Rodrigo, obrigada. Você está certo, as ferramentas tecnológicas escolhidas para este sistema não são ideais. Mas vale dizer que estas funcionalidades de “tempo real” não estavam no escopo. De todo modo, foi um problema de planejamento. É importante dizer também que trata-se de um projeto acadêmico, mas sou muito preocupada com estas questões de arquitetura e e engenharia do sistema (por isso pedi ajuda).
Bom, eu conheço o NodeJS. Se eu optasse por desenvolver estas features de “tempo real” usando javascript e um outro banco de dados como o Nginx (sem ser o que usamos atualmente), como eu poderia proceder para comunicar o sistema atual com estas novas features? O que vc acha? Neste caso, creio que podemos ter problemas de interoperabilidade. Agradeço desde já.
No inicio, para quem esta aprendendo programação, não é bom pensar em arquitetura, pelo simples fato de não conhecer quais as diversas opções tecnológicas que existem, e também não saber direito como uma aplicação web funciona. Um exemplo, é a lógica de programação. Você não aprende lógica de programação estudando lógica de programação. Você aprende lógica de programação é criando um aplicativo, onde o mesmo tem que executar uma tarefa mais complexa, mas que seja bem especifica. Mesmo que esse aplicativo seja para executar só no console de uma ide.
O que você pode fazer, pelo menos em java, é aprende Servlets, Tomcat e Ajax(javascript no browser). Depois você pode aprender Socket.IO para poder criar uma aplicação em tempo real usando o próprio java. Mas tem que saber no minimo Ajax primeiro. E Servlet para muitos, é o ponto mais forte do Java.
A respeito desse tópico, eu devo te falar que a Linguagem java não é assíncrona. O Java para poder executar varias tarefas simultaneamente, ele cria varios thread no servidor(thread é um espaço da memória que o java separa só para aquele processo). Se um restaurante adotasse a forma de trabalhar do java, esse restaurante teria que ter um garçom para cada cliente que entrasse. Tipo enquanto o prato do Cliente 1 não ficasse pronto, o garçom não atenderia o Cliente 2. Por isso teria um segundo garçom. No java, o prato do restaurante, seria os dados de uma banco de dados. Isso é muito ruim quando você tem pouca memoria RAM e um numero grande de acesso. Tipo para 8GB, existiria no máximo 4000 thread(sem falar o consumo de ram de outros programas(ex. banco de dados)), mais que isso você precisaria de mais memória ou servidor, ou seja, usar Java fica mais caro.
Só uma ultima opinião, NodeJS é muuuuito mais fácil do que Java, mas só se você já saber javascript e principalmente arquitetura, ou seja, é melhor ficar no java mesmo, pois a forma de trabalhar do java, apresenta uma arquitetura muita mais consistente. Então aprende primeiro servlet, tomcat, ajax, o design pattern DAO e o Socket.IO para o real-time. Ai depois disso, você decide se vai ou não usar NodeJS ou qualquer outra linguagem.
E banco de dados não depende de linguagem de programação(só se não for tecnologia da Microsoft), depende é dos requisitos que você precisa, embora alem de serem mais rápidos, suportar cargas maiores e principalmente serem mais escaláveis que os bancos relacionais, os bancos de dados NoSQL são mais baratos para administrar/escalar e eu acho que são bem mais fáceis de aprender.
“Nginx não é banco de dados, mas sim um servidor para arquivos estáticos(javascript, css, imagens, pdf, etc…”
Pra melhorar a estrutura sem precisar refazer tudo agora, vc pode usar o componente socket do próprio Prime
Ele abre uma conexão websocket com o cliente e não fica fazendo inúmeras requisições ao server.
No demo do prime tem um chat desenvolvido assim.
ola, bom dia! quando voce fala em servlet como alternativa ao JSF, seria toda a aplicação? baseada em servlet mesmo? por exemplo um sistema ERP por exemplo.