2015-12-28 17 views
9

Sto usando Django 1.6, RabbitMQ 3.5.6, celery 3.1.19.I compiti di Celery con eta vengono rimossi da RabbitMQ

Esiste un'attività periodica che viene eseguita ogni 30 secondi e crea 200 attività con il parametro eta specificato. Dopo aver eseguito il gestore del sedano, lentamente la coda viene creata in RabbitMQ e vedo circa 1200 attività pianificate in attesa di essere licenziate. Quindi, Riavvio del gestore di sedici e tutte le attività in attesa di 1200 programmate vengono rimosse da RabbitMQ.

Come creare attività: my_task.apply_async((arg1, arg2), eta=my_object.time_in_future)

corro il lavoratore in questo modo: python manage.py celery worker -Q my_tasks_1 -A my_app -l

CELERY_ACKS_LATE è impostato su True in ambienti Django. Non ho trovato nessuna ragione possibile.

Devo eseguire il worker con una configurazione/flag/parametro diversa? Qualche idea?

+0

1) Sei sicuro di voler riavviare solo il lavoratore e non l'intero server di coniglio? 2) Forse hai impostato qualche task 'ttl' ora e viene semplicemente rimosso dopo questo tempo? – matino

+0

1) Sono sicuro che solo i lavoratori vengono riavviati. 2) Non c'è nessun TTL impostato su task in nessuna configurazione. È quello di default. Ma se tengo aperti i lavoratori, i compiti rimangono in coda. –

+0

Puoi condividere il registro di debug? –

risposta

1

Per quanto ne so, Celery non si affida alle code programmate di RabbitMQ. Implementa ETA/Conto alla rovescia internamente.
Sembra che tu abbia abbastanza lavoratori che sono in grado di recuperare abbastanza messaggi e programmarli internamente.
Ricorda che non hai bisogno di 200 lavoratori. Hai il prefetch moltiplicatore impostato sul valore predefinito in modo da aver bisogno di meno.