2009-05-10 16 views
9

Sto costruendo la mia prima applicazione Web dopo molti anni di sviluppo di applicazioni desktop (sto usando Django/Python ma forse questa è una domanda completamente generica, non ne sono sicuro). Quindi, per favore attenzione - questa potrebbe essere una domanda ultra-principiante ...Processi di background delle applicazioni Web, domanda di design newbie

Uno dei miei processi utente comporta un'elaborazione pesante nel server (ad esempio, l'utente immette qualcosa, il server ha bisogno di ~ 10 minuti per elaborarlo). Su un'applicazione desktop, ciò che vorrei fare è inserire l'input dell'utente in una coda protetta da un mutex e avere un thread in background dedicato in esecuzione nel blocco a bassa priorità sulla coda usando quel mutex.

Tuttavia nell'applicazione Web tutto sembra orientato alla sincronizzazione con le richieste HTTP.

Supponendo che userò il database come coda, qual è l'architettura di best practice per eseguire un processo in background?

risposta

7

Ci sono due scuole di pensiero su questo (almeno).

  1. Lancia il lavoro su una coda e gestisci qualcos'altro al di fuori del tuo stack web.

  2. Lancia il lavoro su una coda e gestisci qualcos'altro nel tuo stack web.

In entrambi i casi, si crea unità di lavoro in una coda da qualche parte (ad esempio una tabella di database) e lasciare qualche processo prendersi cura di loro.

In genere lavoro con il numero 1 dove ho un servizio Windows dedicato che si occupa di queste cose. Si potrebbe fare anche questo con i lavori SQL o qualcosa di simile.

Il vantaggio dell'articolo 2 è che è possibile conservare più facilmente tutto il codice in un'unica posizione, nel livello Web. Avresti ancora bisogno di qualcosa che faccia scattare l'esecuzione (ad esempio, caricando la pagina web che elabora le unità di lavoro con un timeout sufficientemente elevato), ma ciò potrebbe essere facilmente realizzato con vari meccanismi.

1

Parlando in generale, guarderei i processi in background su un server diverso, specialmente se il tuo server web ha un qualche tipo di carico.

2

dal:

1) Questo è un problema comune,

2) siete nuovi alla piattaforma

- io suggerisco di guardare nelle biblioteche hanno contribuito per la propria piattaforma per trovare una soluzione per gestire l'attività. Oltre alla messa in coda e all'elaborazione dei lavori, è necessario prendere in considerazione:

1) comunicazioni di stato tra l'operatore e lo stack Web. Ciò abiliterà le pagine Web che mostrano il numero completo di percentuale per il lavoro, assicurano all'essere umano che il lavoro sta procedendo, ecc.

2) Come assicurarsi che il processo di lavoro non muoia.

3) Se un lavoro ha un errore, il processo di lavoro lo riproverà automaticamente periodicamente? Verrai avvisato se un lavoro fallisce?

4) Con l'aumentare del numero di lavori, è possibile aggiungere ulteriori lavoratori per ottenere il parallelismo? Oppure, ancora meglio, i lavoratori possono essere aggiunti su altri server?

Se non riesci a trovare una buona soluzione in Django/Python, puoi anche prendere in considerazione il porting di una soluzione da un'altra piattaforma alla tua. Io uso delayed_job per Ruby on Rails. Il processo di lavoro è gestito da runit.

saluti,

Larry

Problemi correlati