Best practice per la gestione di processi asincroni con esecuzione prolungata


12

Sono in fase di progettazione di un progetto in cui l'utente finale inoltrerà una richiesta da una pagina Web che genererà un lavoro elaborato asincrono di lunga durata. Esiste una "best practice" per questo problema? I servizi Web e i broker di servizi sono una buona strada da percorrere? La coda di messaggistica Microsoft è applicabile qui?


Se lo fai sul Web e se impiega molto tempo, puoi inviare un messaggio di testo o un'e-mail all'utente una volta completato.
Giobbe

Risposte:


6

Non conosco le "migliori pratiche". Conosco gli errori più comuni.

Primo errore: DOS te stesso

Si utilizza il webhandler per elaborare il lavoro di lunga durata. Questo può essere negativo o estremamente negativo a seconda della percentuale di accessi che diventano lavori di lunga durata, da quanto tempo durano e da quanto traffico sostenuto ottieni.

Si desidera assicurarsi che non si ottenga più di un lavoro con esecuzione prolungata entro il periodo di tempo necessario per il completamento del lavoro con esecuzione prolungata. Se fai DOS da solo. Inoltre, peggiorerà quanto più traffico si ottiene ipotizzando che la percentuale e il tempo rimangano coerenti. È uno di quei problemi che si autoimposta un limite alla crescita del traffico.

Secondo errore: generazione dal webhandler

Generare un processo dal gestore Web per gestire un processo di lunga durata può essere complicato e, di conseguenza, anche soggetto a errori.

  • Devi dissociarti dal genitore correttamente altrimenti il ​​webhandler attende che il figlio venga completato.
  • Quando fork un figlio in unix, eredita le maniglie aperte dal genitore. Questi verranno automaticamente chiusi a meno che non vengano sovrascritti. Questo include cose come connessioni a database, filehandle, altre connessioni di rete aperte. Tutto ciò viene chiuso al termine del processo figlio.

Opzioni

Di solito uso at(1)per dissociarmi in modo pulito dal webhandler senza biforcazione.

È inoltre possibile utilizzare un'implementazione di polling con cron.

È possibile comunicare con un altro processo server che gestisce l'elaborazione. Tale comunicazione può essere effettuata con sockets, pipeso astrazioni di livello superiore come una chiamata HTTP REST o il routing di un messaggio di coda.


2

Suppongo tu stia parlando di più di qualche minuto.

Se sono pochi minuti, è possibile avviare un thread di lavoro in background e visualizzare alcuni progressi sull'interfaccia utente. Molte applicazioni Web usano questo metodo.

Se è più di, diciamo 5 minuti, potresti voler delegare l'attività a un servizio dedicato. Un esempio sono i rapporti generati da Google Analytics.

La coda di messaggistica Microsoft può essere utilizzata per trasmettere informazioni da un sistema a un altro o un componente a un altro.


In che modo lingue come PHP riescono a farlo? Conosco alcune app Web che lo fanno, ma sono scritte in PHP
TheLQ,

Non sono un esperto di PHP, ma suppongo che invece di un thread lanciato dalla stessa pagina, ne venga chiamato un altro. Questo è ciò che realmente accade con AJAX.
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.