2011-08-22 4 views
20

Sto usando Celery con RabbitMQ. Ultimamente, ho notato che viene fatto un gran numero di code temporanee.Coda temporanea in Celery

Così, ho sperimentato e trovato che quando un compito fallisce (cioè un'attività solleva un'eccezione), allora viene formata una coda temporanea con un nome casuale (come c76861943b0a4f3aaa6a99a6db06952c) e la coda rimane.

Alcune proprietà della coda temporanea come si trova nel rabbitmqadmin sono i seguenti -

auto_delete: True consumatori: 0 durevole: False messaggi: 1 messages_ready: 1

E uno di questi coda temporanea viene eseguito ogni volta che un'attività non riesce (ovvero genera un'eccezione). Come evitare questa situazione? Perché nel mio ambiente di produzione si forma un gran numero di tali code.

+0

Questa è un'osservazione interessante! Anch'io vorrei sapere. –

+1

Ciao Elver. Sono stato in grado di risolvere il problema. Si prega di dare un'occhiata alla risposta (anche da parte mia). Spero che sia d'aiuto. – Siddharth

risposta

11

Bene, Philip è proprio lì. Quanto segue è una descrizione di come l'ho risolto. È una configurazione in celeryconfig.py.

Sto ancora utilizzando CELERY_BACKEND = "amqp" come aveva detto Philip. Ma oltre a questo, ora sto usando CELERY_IGNORE_RESULT = True. Questa configurazione garantirà che le code extra non vengano create per ogni attività.

Stavo già utilizzando questa configurazione ma ancora quando un'operazione non riesce, è stata formata la coda extra. Poi ho notato che stavo usando un'altra configurazione che doveva essere rimossa che era CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True. Ciò che ha fatto non ha archiviato i risultati per tutte le attività, ma ha fatto solo per errori (attività che non hanno funzionato) e quindi una coda aggiuntiva per un'attività che non ha funzionato.

+0

Wow! Questo l'ha risolto per me. Non mi ero nemmeno reso conto che si trattava di un problema da quando stavo impostando ignore_result = True in ogni descrittore di attività. Ma ho aggiunto CELERY_IGNORE_RESULT = True e CELERY_STORE_ERRORS_EVEN_IF_IGNORED = False e viola - non ci sono altre code in sospeso dopo l'elaborazione! Potrei ancora guardare in redis come back-end alternativo, ma è davvero bello aver trovato questa soluzione. Grazie! – chaimp

+0

@jeffp - Sono felice di sentirlo. Ultimamente ho usato Redis anche con Celery - non penso che sia un problema. Celery stesso forma e mantiene la coda. Quindi questa configurazione è importante. – Siddharth

+1

Ho effettivamente scoperto un'altra cosa nel giorno passato che penso sarà molto utile per chiunque stia leggendo questo: è necessario avere più di un lavoratore e indirizzare compiti diversi a ciascun lavoratore. È consigliabile conoscere Celeryd-Multi e usarlo. La documentazione non lo rende ovvio, ma è la chiave per utilizzare efficacemente le risorse di sistema disponibili e non lasciare che la coda venga sottoposta a backup. – chaimp

16

Sembra che tu stia utilizzando l'amqp come backend dei risultati. Dal docs qui sono le insidie ​​di utilizzare quel particolare configurazione:

  • Ogni nuova attività crea una nuova coda sul server, con migliaia di compiti il ​​broker può essere sovraccaricato con code e questo influirà
    prestazioni in modo negativo. Se stai usando RabbitMQ poi ogni coda
    sarà un processo Erlang separata, quindi se avete intenzione di
    mantenere molti risultati contemporaneamente potrebbe essere necessario aumentare l'Erlang
    limite processo, e il numero massimo di descrittori di file il sistema operativo
    permette
  • vecchi risultati non vengono puliti automaticamente, quindi è necessario fare assicurarsi di consumare i risultati oppure il numero di code saranno finalmente andare fuori controllo. Se esegui RabbitMQ 2.1.1 o superiore, puoi avvalerti dell'argomento scade x alle code, , che scadrà le code dopo un certo limite di tempo dopo che saranno inutilizzati. . La scadenza della coda può essere impostata (in secondi) con l'impostazione CELERY_AMQP_TASK_RESULT_EXPIRES (non abilitata di default).

Da quello che ho letto nel changelog, questo non è più il backend predefinito nelle versioni> = 2.3.0 perché gli utenti stavano bit nella parte posteriore da questo comportamento. Suggerirei di modificare il risultato backend se questa non è la funzionalità di cui hai bisogno.

+0

CELERY_AMQP_TASK_RESULT_EXPIRES è stato dichiarato obsoleto, CELERY_TASK_RESULT_EXPIRES è il nuovo nome dell'impostazione di configurazione. L'impostazione predefinita è ora di salvarla per 1 giorno, impostandola su 0 significa conservare per sempre. – cbron

3

Il CELERY_TASK_RESULT_EXPIRES determina il tempo di vita delle code temporanee. Il valore predefinito è 1 giorno. È possibile modificare questo valore.

0

Il motivo per cui questo sta accadendo è perché celery workers remote control è abilitato (è abilitato di default).

È possibile disabilitarlo impostando l'impostazione CELERY_ENABLE_REMOTE_CONTROL False Tuttavia, tenere presente che si perde la capacità di fare le cose come add_consumer, cancel_consumer ecc utilizzando il backend celery command

0

amqp crea una nuova coda per ogni attività. Se vuoi evitarlo, puoi usare il backend rpc che mantiene i risultati in una singola coda.

nella vostra configurazione, impostare

CELERY_RESULT_BACKEND = 'rpc' 
CELERY_RESULT_PERSISTENT = True 

Si può leggere di più su this on celery docs.