5

Ho diversi anni di esperienza nello sviluppo di applicazioni Web con PHP e ho anche lavorato con Java in modo estensivo (ma mai per lo sviluppo di applicazioni web). Sto completando un grande progetto su cui ho lavorato negli ultimi sei mesi, costruito in PHP/CodeIgniter e ospitato con CloudControl (fornisce provisioning e scalabilità automatica del server).Domande su Java per lo sviluppo Web da uno sviluppatore PHP

Il progetto è andato bene e PHP ha soddisfatto le mie esigenze, ma ora sono nella fase iniziale dello sviluppo di un'applicazione Web destinata agli utenti aziendali e sto prendendo in considerazione l'utilizzo di Java (probabilmente "Grails") in collaborazione con AWS Elastic Beanstalk.

La mia prima domanda è: multi-threading, quanto spesso viene utilizzato nello sviluppo di applicazioni Web per Java? Con la mia app PHP, il mio server avrebbe potuto essere chiamato a fare una chiamata API a Facebook in risposta alla richiesta di un utente (ad esempio post al muro di un utente). Per evitare che il mio processo PHP aspetti che la chiamata API sia completata prima di tornare all'utente, ho usato i server di job queer di Gearman con i lavoratori per scaricare il lavoro dal mio server di applicazioni primario a un worker in background.

Uno sviluppatore Java potrebbe semplicemente far ruotare un thread solo per gestire la chiamata API e restituire all'utente il processo principale? È questo il più grande punto di forza dello sviluppo Java su PHP? Grazie!

+1

Mi sono nutrito con entrambe le lingue per un po 'di tempo. La mia opinione molto umile è: la forza di Java è la disponibilità di API e librerie. Per PHP è la velocità per costruire un prototipo o una versione funzionale. Guardami proprio ora, ho scelto ancora java per un nuovo progetto perché sapevo che avrei potuto usare Apache POI invece di PHPExcel ... una sorta di pigrizia. :) – Alfabravo

+1

So che la possibilità di generare nuovi thread è una novità per uno sviluppatore PHP (come me) e avere il potere di usare questa bella funzionalità che PHP manca così disperatamente da origine a tutta una serie di "ooh, potrei fare questo, e questo, e queste cose "tipo di pensieri - ma essere parsimonioso. Ho sentito troppe storie di sviluppatori provenienti da PHP in un linguaggio che consente il multi-threading e di entrare in una situazione in cui hanno avviato 100 thread per eseguire il lavoro di qualcosa che potrebbe essere ragionevolmente fatto in 3, e quindi chiedersi perché il server funziona come un cane. – DaveRandom

+0

Ho usato i thread quando gli utenti richiedono che i dati siano disponibili (le prestazioni sono una caratteristica!) E la raccolta di tutto richiederebbe tempi di attesa lunghi in un singolo thread. Sono sicuro che ci sono molti altri casi in cui si dimostra utile, ma non è un proiettile d'argento o un primo pensiero quando si costruisce qualcosa. – Alfabravo

risposta

2

Uno sviluppatore Java potrebbe semplicemente far ruotare un thread solo per gestire la chiamata API e restituire all'utente il processo principale?

Dipende.

Se lo fai, il thread originale può fare qualcos'altro per un po ', ma a meno che non sia progettato per essere basato su eventi, allora alla fine dovrà aspettare che il thread secondario finisca ... e tu sei di nuovo dove hai iniziato. (In realtà siete peggio ... perché ora che hai avuto 2 thread in attesa.)


Nel caso di un server web implementato utilizzando servlet Java classici, ogni richiesta utente viene eseguito sul proprio thread. L'approccio semplice sarebbe quello di eseguire la chiamata API sul thread di richiesta. Questo blocca il thread, ma altri thread possono lavorare su altre richieste mentre questo sta succedendo. Supponendo di avere abbastanza thread nel pool di thread del contenitore Web, questo funziona correttamente ... anche se finisci per utilizzare molte risorse (memoria) su stack di thread.

Le versioni più recenti delle specifiche del servlet Java hanno aggiunto il supporto per l'elaborazione asincrona. Non sono in grado di accelerare i dettagli, ma in teoria questo ti consente di disconnettere un thread di richiesta da una richiesta mentre quest'ultimo stava facendo qualcosa che richiedeva molto tempo. Tuttavia, non sono convinto che ciò sarebbe di aiuto in questo caso ... a meno che non si disponga di un'implementazione client dell'API che fosse in grado di eseguire simultaneamente più richieste simultanee utilizzando un numero limitato (e limitato) di thread Java.

Ci sono probabilmente altre alternative, ma potrebbero essere molto più lavoro.


Il mio consiglio sarebbe di andare per una soluzione semplice per iniziare. Basta fare la chiamata API sul thread di richiesta e configurare il server Web per utilizzare un numero ragionevole di thread di richiesta.

Le probabilità sono che si sarà in grado di farla franca con "sprecare" parte della memoria per ottenere il throughput effettivamente necessario. A lungo termine potrebbe essere necessario affrontarlo, ma a quel punto avrai avuto il tempo di imparare di più sulle alternative più scalabili.

+0

Ok, ora vedo che qualsiasi thread generato da un processo deve essere completato prima che il thread di esecuzione avviato da una richiesta utente termini. Con il mio host PHP, CloudControl, sono consentiti solo due processi per scatola. Per ridurre la mia necessità di predisporre caselle aggiuntive, ho utilizzato un server per l'accodamento dei processi e l'esecuzione di diversi worker in background che aspettano i lavori, consentendo il ritorno del thread principale quando non è necessario attendere il risultato di una chiamata API –