Domanda

Sto lavorando su un'applicazione Django, che consente agli utenti di caricare i file. Ho bisogno di eseguire alcuni di elaborazione server-side su questi file prima di inviarli al Amazon S3 . Dopo aver letto le risposte a questa domanda e questo post del blog ho deciso che il miglior modo in cui gestire questo è di avere mio punto di vista del gestore invoke un metodo su Pyro oggetto remoto per effettuare l'elaborazione asincrona e poi ritorna immediatamente HTTP 200 al client. Ho questo prototipato e sembra funzionare bene, però, vorrei anche per memorizzare lo stato della lavorazione in modo che il cliente può interrogare l'applicazione per vedere se il file è stato elaborato e caricato S3.

Posso gestire il polling abbastanza facilmente, ma non sono sicuro dove il percorso appropriato è quello di memorizzare lo stato del processo. Ha bisogno di essere scrivibile dal processo di Pyro e leggibile dal mio punto di vista elettorale.

  • Sono titubante per aggiungere colonne al database per i dati che in realtà dovrebbe persistere solo per 30 a 60 secondi.
  • Ho pensato di utilizzare bassa -level cache di API e utilizzando un file id come chiave, però, non credo che questo è davvero ciò che il quadro della cache è stato progettato per e io non sono sicuro di quello che problemi imprevisti ci potrebbe essere con l'andare questo itinerario .
  • Infine, ho preso in considerazione la memorizzazione dello stato nell'oggetto Pyro fare la trasformazione, ma poi sembra ancora come avrei bisogno di aggiungere un "processing_complete" colonna del database booleana in modo che la vista conosce o meno per interrogare stato dal Pyro oggetto.

Naturalmente, ci sono anche alcuni problemi di integrità dei dati con disaccoppiamento stato dal database (cosa succede se il server va giù e tutti questi dati è in memoria?). Sono di sentire come più esperti sviluppatori di applicazioni web dovrebbero gestire questo tipo di trasformazione stateful.

È stato utile?

Soluzione

Lo facciamo avendo un tavolo "Request" nel database.

Al termine del caricamento arriva, creiamo l'oggetto file caricato, e creare una richiesta.

Si comincia il processore background batch.

Si torna a 200 "Stiamo lavorando su di esso", pag. - mostra le richieste e il loro stato

Il nostro processore batch utilizza il Django ORM. Quando finisce, aggiorna l'oggetto Request. Siamo in grado di (ma non) di inviare una notifica via email. Per lo più, dobbiamo solo aggiornare lo stato in modo che l'utente possa accedere nuovamente e vedere che l'elaborazione è stata completata.


note Architettura Batch Server.

E 'un server WSGI che attende su una porta per una richiesta di elaborazione batch. La richiesta è di tipo POST REST con un numero di identificazione; il processore batch guarda questo nel database e lo elabora.

Il server viene avviato automagicamente dalla nostra interfaccia REST. Se non è in esecuzione, abbiamo Spawn esso. Questo fa una transazione utente appare lento, ma, vabbè. Non dovrebbe crash.

Inoltre, abbiamo una semplice crontab per verificare che è in esecuzione. Al massimo, sarà verso il basso per 30 minuti tra le "sei vivo?" controlli. Non abbiamo uno script di avvio formale (si corre sotto Apache con mod_wsgi), ma possiamo creare uno script di "restart" che tocca il file WSGI e poi fa un POST a un URL che fa un check-up (e inizia la processore batch).

Quando il server lotto inizia, ci possono essere richieste non trasformati per i quali non ha mai ottenuto un POST. Così, l'avvio di default è di tirare tutto il lavoro fuori la coda di richieste - ammesso che potrebbe aver perso qualcosa.

Altri suggerimenti

So che questa è una vecchia questione, ma qualcuno potrebbe trovare la mia risposta utile, anche dopo tutto questo tempo, quindi ecco qui.

È possibile di database di utilizzo naturalmente, come coda, ma ci sono soluzioni sviluppate proprio per questo scopo.

AMQP è fatto solo per questo. Insieme a Sedano o carota e un server di mediatore come RabbitMQ o ZeroMQ .

Questo è quello che stiamo usando nel nostro ultimo progetto e si sta lavorando molto.

Per il vostro problema Sedano e RabbitMQ sembra un best fit. RabbitMQ fornisce persistenza dei messaggi, e sedano espone facile viste per il polling per verificare lo stato dei processi eseguiti in parallelo.

Si può anche essere interessati a octopy .

Quindi, si tratta di una coda di lavoro che è necessario. Per il vostro caso, vorrei assolutamente andare con il DB per salvare lo stato, anche se questi stati sono di breve durata. Sembra in grado di soddisfare tutte le vostre esigenze, e non è terribilmente difficile da implementare poiché si dispone già di tutte le parti in movimento lì, a disposizione di voi. Keep it semplice a meno che necessità qualcosa di più complesso.

Se avete bisogno di qualcosa di più potente o più sofisticate, mi aspetto qualcosa come Gearman .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top