Eu ouvi muito bem sobre o JSF, mas até onde eu sei, as pessoas também tiveram muitas queixas sérias com essa tecnologia no passado, sem saber o quanto a situação melhorou. Estamos considerando o JSF como uma tecnologia provável para um projeto de rede social. Mas não temos conhecimento das pontuações de desempenho do JSF nem poderíamos realmente encontrar qualquer site de alto desempenho existente que estivesse usando o JSF. As pessoas reclamam de seus problemas de escalabilidade de desempenho.
Ainda não temos muita certeza se estamos fazendo a coisa certa ao escolher o jsf e, portanto, gostaríamos de ouvir de você tudo sobre isso e levar em consideração suas sugestões.
É possível configurar o JSF para satisfazer as necessidades de alto desempenho do serviço de rede social? Também até que ponto é possível sobreviver com os problemas atuais no JSF. Quais são exatamente os seus problemas?
Eu estou não se preocupava com as complexidades de desenvolvimento com JSF que os outros geralmente se queixam, porque de acordo com a minha experiência pessoal eu acredito que isso não é de todo verdade, mas estou mais preocupado com o que problemas de desempenho e escalabilidade. E, por favor, não abuse apenas de seus problemas antigos vinculados a versões anteriores. Eu só me preocupo com o estado presente, qualquer que tenha sido seu passado.
Respostas:
Definitivamente, o JSF é capaz de fornecer aplicativos da web de alto desempenho. O aplicativo no qual estou trabalhando atualmente é completamente em JSF e, pelas estatísticas de log, vejo que muitas páginas que não fazem uso intensivo de banco de dados têm tempos de execução mínimos de 0ms e tempos médios inferiores a 10ms.
Alguns dos caras do Wicket têm dito coisas sobre o desempenho do JSF, mas, de acordo com essa referência elaborada, o JSF realmente tem um desempenho melhor que o Wicket: http://prezi.com/dr3on1qcajzw/www-world-wide-wait-devoxx-edition/
Observe que, enquanto o servidor não estiver saturado, o JSF também terá um desempenho melhor que o GWT. A comparação de benchmark GWT / JSF é difícil, pois é realmente importante que o servidor para GWT também faça a conversão e validação de dados no postback que o JSF faz. Isso é algo que você simplesmente não pode deixar de lado na prática (nunca confie no cliente). Além disso, para os gráficos GWT x JSF / Wicket, deve-se levar em consideração que a etapa de renderização do navegador é trivial para JSF / Wicket (já que eles geralmente servem HTML pronto para renderizar), mas o cliente GWT ainda tem algum trabalho a fazer. após receber a resposta do servidor.
Um dos principais problemas de desempenho / escalabilidade que as versões antigas do JSF (anteriores à 2.0) tinham, era abusar da economia de estado, colocando muitos dados nela. Coisas que absolutamente não deveriam estar lá onde colocá-lo (como constantes como 'foo' como em
<my:tag attribute="foo"/>
).O JSF 2.0 introduziu o
partial state saving
mecanismo, o que significa que apenas o estado delta está sendo salvo. Na prática, isso pode ser muito pequeno e reduções de duas ordens de magnitude em comparação com o JSF 1.x não são incomuns.Depois de anos usando o JSF, posso dizer que, exceto para salvar muito estado no JSF 1.x, nunca encontrei nenhum problema de desempenho que pudesse atribuir ao JSF. Quaisquer problemas de desempenho que já tivemos foram sempre enraizados no banco de dados e / ou na forma como configuramos serviços de back-end, escrevemos nossas consultas etc.
fonte
Todas as teorias do mundo podem dizer que o JSF é maravilhoso, mas veja como são as suas páginas. Ele produz pilhas maciças de javascript e outras porcarias que prejudicam gravemente sua capacidade de adicionar módulos como jQuery ou uso limpo de CSS. Não estou dizendo que não pode ser feito, mas a que custo.
Experiência pessoal com um projeto relativamente pequeno e de média complexidade. Um desastre. Foi uma bagunça lidar com todos os retornos de chamada e você não pode misturar outras tecnologias facilmente. Tivemos um bug enorme que acabou sendo causado ao usar o JSTL misturado ao JSF. Nunca fomos capazes de usar todo o material do jQuery devido ao fato de que TODO link é um retorno de chamada em javascript.
Fuja e fuja rápido.
Além disso, quando você diz escala, de que tipo de escala você está falando? Número de páginas, número de usuários, número de solicitações por segundo, número de recursos. As respostas para estas podem ajudá-lo. Além disso, quando alguém lhe disser que precisa ser dimensionado, pergunte-lhe em que grau e com que rapidez. A resposta irá ajudá-lo tremendamente. Se você estiver falando da escala do Google em uma semana ou estiver falando de 1000 usuários e 10000 visualizações de página por dia em um ano.
Quase todas as estruturas, com exceção de você digitar respostas em tempo real em segundo plano, serão dimensionadas para atender a 99,999% dos casos de uso.
fonte
Disclaimer: Eu gosto do JSF. De qualquer forma, mesmo com o RI mais recente (Mojarra 2.2.x) ou MyFaces, mesmo com o tão esperado desempenho de implementação sem estado , é muito ruim. Isso ocorre devido ao ciclo de vida do JSF e ao fato de que cada View é (dispendiosamente) criada para cada solicitação.
Para obter uma pista, essa é uma referência simples entre um servlet java simples e uma página JSF, ambos apenas imprimindo "hello world"
Servlet
JSF
fonte
Se você quiser entender mais claramente o desempenho do JSF (tanto o Mojarra 2.1.7 quanto o MyFaces 2.1.7) e compará-lo com uma estrutura semelhante como o Apache Wicket (1.4.20 e 1.5.5), dê uma olhada neste comparação profunda (MAIO 2012):
Noções básicas sobre JSF 2 e Wicket: comparação de desempenho
A parte boa é que tudo está disponível (código, dados experimentais, instruções sobre como reproduzir o teste, um relatório detalhado e exaustivo). Ele resolverá todas as suas perguntas sobre o desempenho do JSF e você verá o que o Apache MyFaces é capaz de fazer.
fonte
Um artigo que pode ajudar um pouco (embora não seja realmente conclusivo) é o Java Frameworks Centrado em Servidor: Comparação de Desempenho no DZone Javalobby:
Não consegui encontrar uma comparação adequada (para desempenho), se alguém encontrar uma que eu adoraria ver!
fonte
Existe um problema com o Facelets em geral que IMHO é uma coisa bastante inconveniente de se usar. É quatro vezes mais prolixo do que realmente necessário e precisa de muito trabalho manual depois que você dá um passo em algo primitivo. O HybridJava seria um bom substituto para o Facelets como mecanismo de apresentação no JSF - ele faz o mesmo trabalho (e muito mais, em particular - ele cria todos os "vínculos" e identificações para você) com muito menos pressionamentos de tecla.
fonte
Então, eu queria colocar uma referência semelhante. Peguei uma página de exemplo de bootstrap do twitter e a converti em xhtml strict. Depois disso, configurei exatamente um bean CDI do ApplicationScoped que retornou Olá, Mundo. Eu coloquei a expressão EL na página. Para a versão JSF, usei o manipulador de recursos JSF, para a versão JSPX, usei o estilo HTML css e js includes.
Eu usei o banco apache para testar o tempo de carregamento da página principal. O teste foi realizado em um servidor TomEE + v1.5.2 não otimizado. Executei cada benchmark 5x e, em seguida, executei um GC completo antes de fazer uma medição. Os testes Bost foram realizados na mesma instância da JVM sem reiniciar a JVM. Eu tenho o APR disponível no libpath, mas não tenho certeza se isso afeta esse teste.
O JSF é mais lento, mas não muito, pois estamos lidando com quantidades muito pequenas. O que não é demonstrado é que, à medida que as páginas ficam mais complexas, o JSF / JSPX é dimensionado linear ou exponencialmente.
Uma coisa que notei é que o JSPX produz muito pouco lixo comparado ao JSF. A execução do benchmark na página JSPX fez com que o heap usado pulasse de 184mb para 237mb. A execução do benchmark na mesma JVM na página JSF faz com que o heap usado pule de 108mb para pelo menos 404mb, mas uma coleta de lixo automática é ativada nesse ponto. Parece que o ajuste do seu coletor de lixo para JSF é uma necessidade absoluta .
JSF
JSPX
fonte
O GWT converte seu código java em script java. portanto, ele é executado como um script java no lado do cliente. E também, você pode integrar o css em seus aplicativos gwt. Em geral, o gwt é leve e pode ser executado em todos os navegadores sem nenhum problema. Eu não sei muito sobre JSF. Mas acho que o JSF não é tão flexível quanto o GWT.
fonte