2015-01-27 22 views
5

L'applicazione è stata creata utilizzando il sedano e recentemente abbiamo ricevuto l'obbligo di eseguire determinate attività nei tempi previsti.celerybeat: più istanze e monitoraggio

penso celerybeat è perfetto per questo, ma ho avuto alcune domande:

  1. E 'possibile eseguire più istanze celerybeat, in modo che i compiti non vengono duplicati?
  2. Come assicurarsi che il celerybeat sia sempre attivo & in esecuzione?

Finora ho letto questo: https://github.com/celery/celery/issues/251 e https://github.com/ybrs/single-beat

Sembra una singola istanza di celerybeat dovrebbe essere in esecuzione.

Sto eseguendo l'applicazione all'interno di contenitori di finestra mobile AWB elastico e gli operatori di sedici sono anche contenitori di docker (quindi è rapidamente scalabile quando necessario).

Sarebbe meglio che il celibato passasse attraverso supervisord insieme ai lavoratori del sedano, ma sembra che questo non sia il modo corretto per farlo.

Allo stesso tempo, disporre di una singola istanza di sedano richiede il provisioning manuale/avvio e monitoraggio.

risposta

4

per rispondere alle vostre domande 2:

  1. Se si esegue più istanze celerybeat si ottiene compiti duplicati, quindi per quanto ne so si dovrebbe avere solo singola istanza celerybeat.

  2. Sto usando supervisord come hai menzionato per eseguire i lavoratori di sedani e gli operatori di celerybeat come Deamon in modo che siano sempre in esecuzione & in esecuzione.

mia supervisord config:

[program:my_regular_worker] 
command=python2.7 /home/ubuntu/workspace/src/manage.py celery worker -Q my_regular_worker-queue_name -c 1 -l info --without-mingle 
process_name=my_regular_worker 
directory=/home/ubuntu/workspace/src 
autostart=true 
autorestart=true 
user=ubuntu 
stdout_logfile=/tmp/my_regular_worker.log 
redirect_stderr=true 



[program:my_celerybeat_worker] 
command=python2.7 /home/ubuntu/workspace/src/manage.py celery worker -Q my_celerybeat_worker-queue_name -c 1 -l info --without-mingle -B -s /tmp/celerybeat-schedule 
0

Si può eseguire più istanze di sedano beat e compiti non verrà duplicata.

Dai un'occhiata alla classe celery.beat.Scheduler, in particolare la funzione reserve(). Lo scheduler riserva un'attività prima di inviarla alla griglia per l'esecuzione. Ciò impedisce ad un'altra istanza di battito del sedano di inviare lo stesso compito.

Utilizziamo MongoDB come backing store per le nostre attività pianificate. Ecco un documento di esempio che mostra che l'attività è stata prenotata da uno degli scheduler.

{ 
    "startdate": "2015-07-06 00:00:00", 
    "task": "cobalt.grid.tasks_facts.task_add", 
    "enddate": "2018-01-01 00:00:00", 
    "args": "[13.0, 42.0]", 
    "enabled": "True", 
    "last_run_at": "2015-08-13 15:04:49.058000", 
    "interval": "{u'every': u'1', u'period': u'minutes'}", 
    "relative": "False", 
    "total_run_count": "12", 
    "kwargs": "{}", 
    "reserved": "compute2:25703", 
    "_id": "ObjectId(55ccaf7784a3e752e73b08c2)", 
    "options": "{}" 
} 

http://celery.readthedocs.org/en/latest/reference/celery.beat.html#celery.beat.Scheduler

+4

Non riesco a riprodurre questo comportamento con _djcelery_'s "DatabaseScheduler'.Sto usando un intervallo di programmazione 'timedelta (seconds = 5)' e un database _SQLite_ per il test. Le attività vengono inserite nella coda ed elaborate due volte se sono in esecuzione due processi 'beat'. – Feuermurmel

+1

Qui potrei sbagliarmi, ma non è questo processo di "prenotazione" appena usato in modo che più lavoratori non eseguano lo * stesso * lavoro? Non ha nulla a che fare con la sincronizzazione di più scheduler in modo che non possano avviare processi duplicati. – Ian

+1

@Feuermurmel Lo confermo. Celerybeat deve essere eseguito solo una volta. –

0

Ho appena trovato questa soluzione come ricambio sedano-beat: RedBeat, blog post

non lo uso ancora però.