JSF è davvero pronto a fornire applicazioni Web ad alte prestazioni? [chiuso]


16

Ho sentito molto bene su JSF, ma per quanto ne so la gente ha anche avuto molte lamentele serie con questa tecnologia in passato, non consapevole di quanto sia migliorata la situazione. Stiamo considerando JSF come una probabile tecnologia per un progetto di social network. Ma non siamo a conoscenza dei punteggi delle prestazioni di JSF né potremmo davvero imbatterci in alcun sito Web ad alte prestazioni esistente che utilizzava JSF. Le persone si lamentano dei suoi problemi di scalabilità delle prestazioni.

Non siamo ancora molto sicuri se stiamo facendo la cosa giusta scegliendo jsf, e quindi vorrei sentire tutto da te su questo e prendere in considerazione i tuoi input.

È possibile configurare JSF per soddisfare le esigenze di prestazioni elevate del servizio di social network? Anche fino a che punto è possibile sopravvivere con gli attuali problemi di JSF. Quali sono esattamente i suoi problemi?


Sto non preoccupato per la complessità di sviluppo con JSF ciò che gli altri di solito si lamentano perché come per la mia esperienza personale credo che non è affatto vero, ma io sono più preoccupato per quello che i problemi di prestazioni e scalabilità. E per favore non limitarti ad abusarne dei vecchi problemi collegati alle versioni precedenti. Mi interessa solo lo stato attuale qualunque sia stato il suo passato.


7
ptrthomas.wordpress.com/2009/05/15/jsf-sucks So che c'è stata una risposta del capo architetto JSF che giustifica ogni decisione, ma per me qualcuno che conosce alcune tecnologie web e che ha sofferto, anche con JSF 2.0, Facelets e SEAM, questa è una beffa. Persino James Gosling dice: "Odio JSF con passione". Userei Wicket o Tapestry ed eviterei del tutto JSF e i suoi problemi.
Falcon,

12
@ ThorbjørnRavnAndersen Non sono d'accordo con te delicatamente. Penso che sia meglio fornire più spiegazioni che dire semplicemente: "Odio JSF"
Chirone

6
@ ThorbjørnRavnAndersen Capisco il tuo punto, ma incoraggio davvero le persone a fornire maggiori informazioni. Ad esempio, un voto negativo senza un commento mi dà sempre fastidio.
Chirone,

3
@Chiron, la domanda non è se JSF sia utilizzabile o meno, ma se JSF può essere fatto per eseguire. Le persone che iniziano mettendo giù il framework, molto probabilmente non possono rispondere alla domanda reale. Mantenendo un'applicazione JSF, mi piacerebbe saperlo anche io.

3
> Anche James Gosling dice: "Odio JSF con passione". - È noto che si è trattato di un errore, poiché intendeva dire JSP. Ascolta attentamente il frammento in questione. Riguarda ciò che è stato creato in risposta al classico ASP e che era JSP, non JSF.
Arjan Tijms,

Risposte:


24

JSF è sicuramente in grado di fornire applicazioni Web ad alte prestazioni. L'app su cui sto attualmente lavorando è completamente in JSF e dalle statistiche del registro posso vedere che molte pagine non DB intensive hanno tempi di esecuzione minimi di 0 ms e tempi medi di meno di 10 ms.

Alcuni ragazzi di Wicket hanno detto cose sulle prestazioni di JSF, ma secondo questo elaborato benchmark JSF ha effettivamente prestazioni migliori di Wicket: http://prezi.com/dr3on1qcajzw/www-world-wide-wait-devoxx-edition/

Si noti che fino a quando il server non è saturo, JSF offre prestazioni migliori di GWT. Il confronto dei benchmark GWT / JSF è tuttavia difficile, poiché è davvero importante che il server per GWT esegua anche la conversione e la convalida dei dati nel postback che JSF fa. Questo è qualcosa che semplicemente non puoi tralasciare in pratica (non fidarti mai del cliente). Inoltre, per i grafici GWT vs JSF / Wicket, si dovrebbe tenere conto del fatto che la fase di rendering del browser è banale per JSF / Wicket (poiché servono principalmente HTML pronto per il rendering), ma il client GWT ha ancora del lavoro da fare eseguire dopo aver ricevuto la risposta del server.

Uno dei maggiori problemi di prestazioni / scalabilità delle vecchie versioni JSF (precedenti alla 2.0) era abusare del salvataggio dello stato inserendo troppi dati al suo interno. Cose che assolutamente non avrebbero dovuto essere lì dove sono state inserite (come costanti come "pippo" come in <my:tag attribute="foo"/>).

JSF 2.0 ha introdotto il partial state savingmeccanismo, il che significa che viene salvato solo lo stato delta. In pratica questo può essere molto piccolo e le riduzioni di due ordini di grandezza rispetto a JSF 1.x non sono rare.

Dopo anni di utilizzo di JSF, posso dire che, a parte il fatto di aver salvato troppo stato in JSF 1.x, non ho mai riscontrato problemi di prestazioni che potrei attribuire a JSF. Eventuali problemi di prestazioni che abbiamo mai avuto erano sempre radicati nel DB e / o nel modo in cui abbiamo impostato i servizi di back-end, scritto le nostre query, ecc


1
0 ms ... Penso che i tuoi mezzi di misurazione debbano essere esaminati.
gbjbaanb,

2
@gbjbaanb Non credo, questi provengono da statistiche che sono state create in modo abbastanza professionale. Si noti che sto parlando del tempo minimo e delle pagine che non richiedono DB . Le pagine in esecuzione in quel momento ovviamente non avevano 1000 componenti distribuiti su 100 inclusioni. Stiamo parlando di pagine relativamente semplici qui, forse 10 componenti, 1 modello principale, forse 1 include, su un server che è in esecuzione da un po ', quindi tutto è caldo e in memoria. Il tempo medio è più alto (10ms come ho già detto) e anche il 90% in più. Max può essere qualsiasi cosa.
Arjan Tijms,

La situazione è che questo mondo critica solo quelle cose che sono in grado di risolvere tutti i problemi. Ma risolvere tutti i problemi ha sempre un prezzo e richiede un grande zelo e un entusiasmo. Quello che ho visto nei team è che iniziano a svilupparsi senza nemmeno capire il ciclo di vita. Implica una ripida curva di apprendimento ma è bella oltre che notevole.
Shirgill Farhan,

È più probabile che il collo di bottiglia sia nel database / I / O e larghezza di banda (mobile ...) rispetto al server stesso. Java è molto veloce se usato bene.
Christophe Roussy,

8

Tutti i teorici del mondo possono dire che JSF è meraviglioso, ma dai un'occhiata a come sono le tue pagine. Produce enormi pile di javascript e altre cazzate che compromettono gravemente la tua capacità di aggiungere moduli come jQuery o un uso pulito dei CSS. Non dire che non si può fare, ma a quale costo.

Esperienza personale con un progetto relativamente piccolo e una media complessità. Un disastro. Era un disastro con tutti i callback e non è possibile mescolare facilmente altre tecnologie. Abbiamo riscontrato un enorme bug che si è rivelato essere causato dall'uso di JSTL in combinazione con JSF. Non siamo mai stati in grado di utilizzare tutte le cose jQuery a causa del fatto che OGNI link è un callback javascript.

Scappa e scappa velocemente.

Anche quando dici scala, di che tipo di scala stai parlando. Numero di pagine, numero di utenti, numero di richieste al secondo, numero di funzioni. Le risposte a queste potrebbero aiutarti. Inoltre, quando qualcuno ti dice che è necessario ridimensionarlo, chiedigli in che misura e quanto velocemente. La risposta ti aiuterà moltissimo. Se stai parlando di google scale in una settimana o stai parlando di 1000 utenti e 10000 visualizzazioni di pagina al giorno in un anno.

Quasi tutti i framework, a meno che non si digiti in tempo reale le risposte in background, si ridimensioneranno per soddisfare il 99,999% dei casi d'uso.


3
-1 per qualsiasi scala di framework. È come dire "non preoccuparti delle prestazioni".
Raynos,

3
Di per sé, qualsiasi framework web pubblicato verrà ridimensionato, incluso JSF. Dicono tutti che lo fanno, sarebbe un quadro piuttosto schifoso se non lo facesse. Detto questo, molte persone fanno cose stupide con esso e di solito è qui che sorgono i problemi di ridimensionamento.
Bill Leeper,

1
vero, ma alcuni framework ti incoraggiano a fare le cose con ostacoli al ridimensionamento, o perché il framework incoraggia o la comunità lo incoraggia. Direi che quei quadri non si ridimensionano.
Raynos,

Il bit "come si misura il ridimensionamento" dovrebbe forse essere un commento alla domanda?

4

Disclaimer: mi piace JSF. Ad ogni modo, anche con l'ultimo RI (Mojarra 2.2.x) o MyFaces, anche con le tanto attese prestazioni di implementazione senza stato è molto scadente. Ciò è dovuto al ciclo di vita di JSF e al fatto che ogni vista è (costosa) costruita per ogni richiesta.

Per avere un'idea, questo è un semplice punto di riferimento rispetto a un semplice servlet java rispetto a una pagina JSF, entrambi che stampano semplicemente "ciao mondo"

servlet

glassfish-3.1.2.2$ ab -n 10000 -c 100 http://localhost:8080/mavenproject-web/NewServlet

Server Software:        GlassFish
Server Hostname:        localhost
Server Port:            8080

Document Path:          /mavenproject-web/NewServlet
Document Length:        128 bytes

Concurrency Level:      100
Time taken for tests:   0.970 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      4300000 bytes
HTML transferred:       1280000 bytes
Requests per second:    10307.02 [#/sec] (mean)
Time per request:       9.702 [ms] (mean)
Time per request:       0.097 [ms] (mean, across all concurrent requests)
Transfer rate:          4328.14 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   1.0      1       5
Processing:     1    9   4.6      8      51
Waiting:        1    8   4.4      7      40
Total:          4   10   4.1      8      51

Percentage of the requests served within a certain time (ms)
  50%      8
  66%     10
  75%     11
  80%     11
  90%     12
  95%     14
  98%     29
  99%     33
 100%     51 (longest request)

JSF

glassfish-3.1.2.2$ ab -n 10000 -c 100 http://localhost:8080/mavenproject-web/xhtml/test/jsf.xhtml

Server Software:        GlassFish
Server Hostname:        localhost
Server Port:            8080

Document Path:          /mavenproject-web/xhtml/test/jsfxhtml
Document Length:        100 bytes

Concurrency Level:      100
Time taken for tests:   4.676 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      4250000 bytes
HTML transferred:       1000000 bytes
Requests per second:    2138.60 [#/sec] (mean)
Time per request:       46.759 [ms] (mean)
Time per request:       0.468 [ms] (mean, across all concurrent requests)
Transfer rate:          887.60 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.5      0       6
Processing:     5   46   6.0     46      73
Waiting:        2   45   5.5     45      72
Total:          8   47   5.8     46      73

Percentage of the requests served within a certain time (ms)
  50%     46
  66%     48
  75%     50
  80%     51
  90%     54
  95%     56
  98%     60
  99%     62
 100%     73 (longest request)

1
Non penso che una semplice pagina di helloworld possa essere rappresentativa o significativa. Un confronto serio deve fornire le informazioni necessarie come i numeri di versione, la configurazione utilizzata e così via. Si prega di leggere il confronto tra JSF e Wicket in una risposta precedente.
lu4242,

Vorrei essere in disaccordo. Trovo davvero significativo che nel contesto stateless più semplice jsf sia 5 volte più lento di jsp. È banale verificare che in scenari più complessi le prestazioni di jsf peggiorino. Oppure posso fornire più parametri di riferimento per il più pigro :-) L'implementazione di jsf è mojarra 2.2 come indicato sopra, con
glassfish

"... jsf è 5 volte più lento di jsp ..." Penso che l'errore qui non tenga conto del throughput e del comportamento sottostante di jsp vs jsf. È troppo complesso da spiegare, ma in questo caso il tempo di risposta è ovviamente più lento perché jsf ha un effetto di concorrenza che jsp non ha. Ma alla fine è più preciso confrontare i cicli al secondo. Inoltre, Mojarra non è uguale a MyFaces, quindi entrambe le implementazioni hanno numeri diversi dal punto di vista delle prestazioni. Si noti che l'effetto concorrenza in questo caso è esagerato.
lu4242,

In effetti, è completamente assurdo confrontare un servlet semplice con JSF. L'unico confronto che ha senso è una "applicazione" fatta usando JSP / servlet contro un'altra "applicazione" che fa esattamente la stessa cosa usando JSF. Perché? perché JSF fornisce soluzioni integrate per il rendering / ajax / navigazione / validazione, cose che devono essere fatte da zero o manualmente in JSP. Anche se il confronto è interessante dal punto di vista delle prestazioni (nessun framework sarà più veloce di servlet / jsp), JSP non può competere con JSF, perché non fa nemmeno una piccola parte di ciò che JSF fa per te.
lu4242,

"è del tutto assurdo confrontare un semplice servlet contro JSF". no non lo è. entrambe le tecnologie dovrebbero fornire contenuti. questo è il motivo per cui sto prendendo in considerazione contesti apolidi, in cui la validazione e altre cose non contano. "il tempo di risposta è ovviamente più lento perché jsf ha un effetto di concorrenza che jsp non ha" non è questo stesso un problema di scalabilità? a proposito di myfaces, afaik mojarra è l'implementazione più veloce in circolazione (indagherò su questo)
gpilotino

3

Se vuoi capire più chiaramente le prestazioni di JSF (sia Mojarra 2.1.7 che MyFaces 2.1.7) e confrontarlo con un framework simile come Apache Wicket (sia 1.4.20 che 1.5.5), dai un'occhiata a questo in- confronto profondo (MAGGIO 2012):

Comprensione di JSF 2 e Wicket: confronto delle prestazioni

La parte buona è che tutto è disponibile (codice, dati sperimentali, istruzioni su come riprodurre il test, un rapporto dettagliato ed esaustivo). Risolverà tutte le tue domande sulle prestazioni di JSF e vedrai cosa Apache MyFaces è in grado di fare.


3

Un articolo che potrebbe aiutare un po '(anche se non in modo conclusivo) è Server Centric Java Frameworks: Confronto delle prestazioni su DZone Javalobby:

... Questo articolo esamina l'efficacia della maggior parte dei framework Web SPI Java sulle modifiche parziali fornite dal server. Non siamo interessati ad eventi senza comunicazione tra server, ovvero eventi senza controllo (possibile) del server.

Come verranno misurati

Misureremo la quantità di codice che viene inviato al client in relazione alla modifica visiva eseguita nel client .

Ad esempio per una piccola modifica visiva (alcuni nuovi dati) in un componente, ci aspettiamo che non ci sia molto codice dal server, ovvero il nuovo markup necessario come HTML normale o incorporato in JavaScript o alcune istruzioni di alto livello contenenti i nuovi dati da visualizzato. Altrimenti qualcosa sembra sbagliato, ad esempio il componente completo o l'area della pagina viene ricostruita, sprecando larghezza di banda e potenza del client (e forse potenza del server).

Poiché utilizzeremo demo pubbliche, non otterremo un benchmark definitivo e di qualità . Vedrai differenze molto forti tra i framework.

La tecnica di test è molto semplice e tutti possono farlo senza infrastrutture speciali, abbiamo solo bisogno di FireFox e FireBug. In questo test vengono utilizzati FireFox 3.6.8 e FireBug 1.5.4.

La Console FireBug quando "Show XMLHttpRequests" è abilitato registra qualsiasi richiesta AJAX che mostra la risposta del server ...

Strutture testate

RichFaces , IceFaces , MyFaces / Trinidad , OpenFaces , PrimeFaces , Vaadin , ZK , ItsNat

... a quanto pare l'unica implementazione JSF priva di gravi penalità di prestazione è PrimeFaces ...

Non sono stato in grado di trovare un confronto adeguato (per prestazioni), se qualcuno lo trova mi piacerebbe vederlo!


2

C'è un problema con Facelets in generale che IMHO è una cosa piuttosto scomoda da usare. È quattro volte più prolisso di quanto sia effettivamente necessario e ha bisogno di troppo lavoro manuale una volta che fai un passo fuori da qualcosa di primitivo. HybridJava sarebbe un buon sostituto di Facelets come motore di presentazione all'interno di JSF - fa lo stesso lavoro (e ancora di più, in particolare - rende tutti i "vincoli" e gli ID per te) con un numero molto minore di tasti.


1

Quindi volevo lanciare un benchmark simile. Ho preso a pagina di esempio Twitter Bootstrap e l'ho convertita in xhtml rigoroso. Successivamente, ho impostato esattamente un bean CDI ApplicationScoped che ha restituito Hello, World. Ho messo l'espressione EL sulla pagina. Per la versione JSF, ho usato il gestore di risorse JSF, per la versione JSPX, ho usato lo stile HTML css e include js.

Ho usato la panchina di Apache per testare il tempo di caricamento della pagina principale. Il test è stato eseguito su un server TomEE + v1.5.2 non ottimizzato. Ho eseguito ogni benchmark 5 volte, quindi ho eseguito un GC completo prima di eseguire una misurazione. I test Bost sono stati eseguiti nella stessa istanza JVM senza riavviare JVM. Ho l'APR disponibile su libpath, ma non sono sicuro che influenzi questo test.

JSF è più lento, ma non di molto, poiché abbiamo a che fare con quantità molto ridotte. Cosa è non dimostrato è che le pagine diventano più complesse, JSF / JSPX si ridimensiona in modo lineare o esponenziale.

Una cosa che ho notato è che JSPX produce pochissima spazzatura rispetto a JSF. L'esecuzione del benchmark sulla pagina JSPX ha causato il salto dell'heap usato da 184mb a 237mb. L'esecuzione del benchmark nella stessa JVM sulla pagina JSF fa sì che l'heap usato salti da 108mb ad almeno 404mb, ma a quel punto è iniziata una raccolta automatica dei rifiuti. Sembrerebbe sintonizzare il tuo garbage collector per JSF è una necessità assoluta .

JSF

jonfisher@peanut:~$ /usr/local/bin/ab -n 10000 -c 100 http://localhost:8080/cdi-jsp/index.jsf
This is ApacheBench, Version 2.3 <$Revision: 1373084 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        Apache-Coyote/1.1
Server Hostname:        localhost
Server Port:            8080

Document Path:          /cdi-jsp/index.jsf
Document Length:        2904 bytes

Concurrency Level:      100
Time taken for tests:   2.138 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      32160000 bytes
HTML transferred:       29040000 bytes
Requests per second:    4677.27 [#/sec] (mean)
Time per request:       21.380 [ms] (mean)
Time per request:       0.214 [ms] (mean, across all concurrent requests)
Transfer rate:          14689.55 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   1.3      1      21
Processing:     1   20   9.0     18      63
Waiting:        1   19   8.8     17      62
Total:          2   21   8.8     20      64

Percentage of the requests served within a certain time (ms)
  50%     20
  66%     23
  75%     25
  80%     27
  90%     32
  95%     39
  98%     46
  99%     50
 100%     64 (longest request)

JSPX

jonfisher@peanut:~$ /usr/local/bin/ab -n 10000 -c 100 http://localhost:8080/cdi-jsp/page2.jspx
This is ApacheBench, Version 2.3 <$Revision: 1373084 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        Apache-Coyote/1.1
Server Hostname:        localhost
Server Port:            8080

Document Path:          /cdi-jsp/page2.jspx
Document Length:        2440 bytes

Concurrency Level:      100
Time taken for tests:   1.273 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      26290000 bytes
HTML transferred:       24400000 bytes
Requests per second:    7856.63 [#/sec] (mean)
Time per request:       12.728 [ms] (mean)
Time per request:       0.127 [ms] (mean, across all concurrent requests)
Transfer rate:          20170.98 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    5   2.3      6      20
Processing:     1    8   4.6      6      40
Waiting:        1    8   4.3      6      40
Total:          2   13   3.8     12      41

Percentage of the requests served within a certain time (ms)
  50%     12
  66%     12
  75%     13
  80%     13
  90%     17
  95%     20
  98%     24
  99%     28
 100%     41 (longest request)

-3

GWT converte il tuo codice java in script java. quindi viene eseguito come script java sul lato client. Inoltre, puoi integrare css nelle tue applicazioni gwt. In generale, gwt è leggero e può funzionare su tutti i browser senza alcun problema. Non so molto su JSF. Ma penso dt, JSF non è così flessibile come GWT.


1
Non risponde alla domanda, che riguarda le prestazioni di JSF e non le raccomandazioni del framework. Ad ogni modo, GWT è di solito apprezzato da persone che non conoscono JavaScript ^^
Danubian Sailor,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.