2013-12-10 9 views
31

Sto utilizzando java (Servlets, JSPs) da 2 anni per lo sviluppo di applicazioni Web. In quei 2 anni non ho mai richiesto di utilizzare multithreading (esplicitamente - come so che i contenitori servlet utilizzano la filettatura per servire lo stesso servlet a richieste diverse) in qualsiasi progetto.ruolo del multithreading nell'applicazione Web

Ma ogni volta che intervengo per la posizione di sviluppatore web (java), ci sono diverse domande relative ai thread in java. Conosco le basi del threading Java così rispondere alle domande non è un problema. Ma a volte mi confondo se mi manca qualcosa mentre sviluppo un'applicazione web non usando il mutithreading?

Quindi la mia domanda è: qual è il ruolo di multithreading nell'applicazione Web? Ogni esempio in cui è possibile utilizzare multithreading nell'applicazione Web sarà apprezzato.

Grazie in anticipo.

+2

IMHO, sei assolutamente corretto che il ruolo principale del multithreading nelle app Web sia gestire simultaneamente più richieste indipendenti e quindi rendere il server reattivo. – Ingo

+4

Ad esempio, si dispone di una pagina di registrazione utente ed è necessario inviare la notifica e-mail dell'utente relativa alla registrazione. In questo caso possiamo usare il multithreading inviando email in thread separati. – Foolish

+1

Sto usando il multi threading per l'analisi di xmls –

risposta

40

Il multi-threading può essere utilizzato nelle app Web principalmente quando si è interessati alle chiamate asincrone.

Consideriamo ad esempio un'applicazione Web che attiva lo stato di un utente su una rete GSM (ad esempio, attiva il piano 4G) e invia un SMS di conferma o un messaggio di posta elettronica alla fine.

Sapendo che la chiamata Web richiederebbe diversi minuti, soprattutto se la rete GSM è stressata, non ha senso chiamarla direttamente dal thread Web.

Quindi, in pratica, quando un utente fa clic su "Attiva", il server restituisce qualcosa come "Grazie per l'attivazione del piano di 4G. Il piano verrà attivato in pochi minuti e riceverai uno SMS di conferma/e-mail".

In tal caso, il server deve generare un nuovo thread, idealmente utilizzando un pool di thread, in modo asincrono e restituire immediatamente una risposta all'utente. scatta

1- utente "Attiva" pulsante
2- Servlet riceve richiesta e attiva un nuovo compito "Piano 4G Attiva" in un pool di thread:

Workflow.
3- Servlet restituisce immediatamente una risposta HTML all'utente senza attendere che l'attività venga finalizzata.
4- End of Http transaction
. . .

in modo asincrono, il piano di 4G viene attivato in seguito e l'utente viene avvisato tramite SMS o e-mail, ecc ...

5

Parlando di un esempio reale, ci sono diversi motivi per utilizzare il multi-threading, e io non assumerebbe uno sviluppatore web che non lo sa. Ma alla fine, i motivi per usare il multi-threading sono gli stessi per lo sviluppo standard e web: o vuoi qualcosa che richiede un po 'di tempo (anche in blocco) fatto in background per dare all'utente una risposta in mezzo, o tu avere un compito che può essere accelerato facendolo girare su più core. Quando il multi-threading è effettivamente utile è comunque una domanda diversa.

Situazione 1: un server Web che richiede una certa elaborazione e ha colpi bassi/secondo

Qui multi-threading (se applicabile per l'algoritmo) è una buona cosa, core come inattive vengono utilizzati e filettatura può comportare una risposta più rapida all'utente.

Situazione 2: un server Web che richiede una certa elaborazione e di elevata colpi/secondo

Qui multi-threading è possibile, ma come nuclei di solito sono occupati con altre richieste, non ci sono risorse a sinistra per usalo correttamente Effettivamente diffondere il compito di diversi fili possono anche avere un impatto negativo sul tempo di risposta, come il compito è ora frammentata e tutte le parti devono completare, ma l'ordine di esecuzione con fili è indefinito. Così un cliente potrebbe ricevere immediatamente una risposta, mentre altri potrebbero attendere il timeout fino a quando il loro ultimo frammento non viene elaborato.

Situazione 3: Un server web deve fare un po 'di elaborazione che richiede un tempo molto lungo è richiesto

Qui multi-threading, non c'è modo intorno ad esso. Un cliente non può attendere minuti o probabilmente ore prima di ricevere la risposta. In questo caso, solitamente viene implementato un sistema di callback, quindi in pratica ogni task ha una "API" che può essere interrogata per lo stato corrente. La maggior parte dei negozi online ne è un esempio: ordini qualcosa e in seguito puoi richiedere lo stato del tuo ordine.

L'alternativa di filettatura è processo fork, come Apache fa nella sua configurazione standard. Il vantaggio è che il carico si sviluppa su core (per lo più applicabile alla situazione 2), e il web-codice stesso non deve fare nulla di utilizzare tutte quelle core, come il sistema operativo gestisce che automaticamente. Tuttavia, se il carico è sbilanciato, alcuni core possono essere inattivi e le risorse non vengono utilizzate in modo ottimale. Una situazione di threading è quasi sempre la soluzione migliore, se è fatta bene. Ma la configurazione standard di Apache/Tomcat utilizza un modello di thread molto obsoleto, generando un thread per ogni richiesta. Effettivamente dato un certo numero di colpi al secondo, la CPU è più occupata con il threading che con l'elaborazione effettiva di quelle richieste.

+0

La situazione 3 non è un caso d'uso per JMS, code di messaggi ecc.? Cosa usare per questo, multithreading o coda dei messaggi? – onlinenaman

+0

Di solito una combinazione di entrambi. Il multithreading consente di utilizzare tutte le risorse disponibili e tecniche come code dei messaggi per assicurarsi che vengano utilizzate con un'efficienza del 100%. – TwoThe

3

Beh, questa è una bella domanda e credo che la maggior parte degli sviluppatori che lavorano nello sviluppo di applicazioni web non utilizzare il multithreading in modo esplicito. Il motivo è abbastanza ovvio dal momento che si sta utilizzando un server applicazioni per distribuire l'applicazione, l'application server gestisce internamente un pool di thread per le richieste in arrivo.

Allora perché l'uso multithreading in modo esplicito? A cosa serve uno sviluppatore di applicazioni Web esporsi al multithreading?

Quando si lavora su un'applicazione su larga scala in cui è necessario eseguire molte richieste contemporaneamente, è difficile servire ogni tipo di richiesta in modo sincrono poiché un particolare tipo di richiesta avrebbe potuto eseguire un sacco di elaborazione che potrebbe ridurre le prestazioni dell'applicazione .

consente di dare un esempio in cui un'applicazione web dopo aver scontato particolare tipo di richiesta deve comunicare agli utenti tramite e-mail e SMS. Farlo in modo sincrono con il thread di richiesta potrebbe ridurre le prestazioni della tua applicazione web. Quindi ecco che arriva il ruolo del mutlithreading. In questi casi si consiglia di sviluppare uno stand alone applicazioni multithread in rete, che è responsabile per l'invio di e-mail e SMS solo.

0

Multi-calpestio in applicazione web può essere utilizzato quando si è interessati in azione parallelamente, ad esempio, il recupero dei dati da più indirizzi.

quanto ho capito, il multi-threading è utilizzato in situazione diversa da filo-piscina, che può essere utilizzato per gestire le richieste provenienti da più client.