2010-11-22 16 views
5

Qual è il modo migliore per gestire le attività eseguite in Celery dove il risultato è ampio? Sto pensando a cose come i dump della tabella e simili, dove potrei restituire i dati nelle centinaia di megabyte.Come dovrei usare Celery quando i risultati dell'attività sono grandi?

Sto pensando che l'approccio ingenuo di stipare il messaggio nel database dei risultati non mi servirà qui, tanto meno se utilizzo AMQP per il mio backend di risultati. Tuttavia, ho alcuni di questi casi in cui la latenza è un problema; a seconda della particolare istanza dell'esportazione, a volte devo bloccare fino a quando non restituisce e direttamente emettere i dati di esportazione dal client di attività (una richiesta HTTP è arrivata per il contenuto di esportazione, non esiste, ma deve essere fornito nella risposta a tale richiesta ... non importa quanto tempo ci vuole)

Quindi, qual è il modo migliore per scrivere attività per questo?

risposta

4

Un'opzione sarebbe avere un server HTTP statico in esecuzione su tutte le macchine worker. L'attività può quindi riversare il risultato di grandi dimensioni in un file univoco nella radice statica e restituire un riferimento URL al file. Il ricevitore può quindi recuperare il risultato a suo piacimento.

es. Qualcosa di vagamente simile a questo:

@task 
def dump_db(db): 
    # Some code to dump the DB to /srv/http/static/db.sql 
    return 'http://%s/%s.sql' % (socket.gethostname(), db) 

Si sarebbe ovviamente bisogno di qualche mezzo per raccogliere i vecchi file, oltre a garantire l'unicità, e probabilmente altre questioni, ma si ottiene l'idea generale.

0

Lo gestisco strutturando la mia app per scrivere i risultati del multi-megabyte in file, che io li memorizzo in memoria in modo che siano condivisi tra tutti i processi che usano quei dati ... Ciò limita totalmente la domanda su come ottenere i risultati su un'altra macchina, ma se i risultati sono così grandi, sembra che queste attività siano coordinate interne tra i processi del server.

Problemi correlati