2015-01-27 22 views
5

Mam aplikację zbudowaną przy użyciu selera, a ostatnio dostaliśmy wymaganie, aby wykonywać określone zadania zgodnie z harmonogramem.Celerybeat - wiele instancji i monitorowanie

myślę celerybeat jest idealny do tego, ale mam kilka pytań:

  1. to możliwe, aby uruchomić wiele instancji celerybeat tak, że zadania nie są duplikowane?
  2. Jak upewnić się, że celerybeat jest zawsze ustawiony na & działa?

tej pory czytałem to: https://github.com/celery/celery/issues/251 i https://github.com/ybrs/single-beat

Wygląda jednej instancji celerybeat powinien być uruchomiony.

Używam aplikacji w kontenerach dokerów AWS elasticbeanstalk i pracownikach selerów (również w razie potrzeby można je szybko skalować).

Najlepiej byłoby, gdyby selekcja przebiega przez supervisord razem z selerami, ale wydaje się, że nie jest to właściwy sposób.

Jednoczesne posiadanie tego pojedynczego wystąpienia celerybeat wymagałoby ręcznego zapewniania/uruchamiania i monitorowania.

Odpowiedz

4

Aby odpowiedzieć na 2 pytania:

  1. Jeśli uruchomić kilka instancji celerybeat masz zduplikowane zadań, tak AFAIK trzeba mieć tylko jeden celerybeat instancji.

  2. Używam supervisord, jak wspomniałeś, aby uruchomić pracowników selera i pracowników selera, jako deamon, więc powinni zawsze być na bieżąco.

mój 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

może uruchomić wiele instancji selera rytm i zadania nie będą duplikowane.

Zobacz klasę celery.beat.Scheduler, a konkretnie funkcję reserve(). Harmonogram zarezerwuje zadanie przed wysłaniem go do siatki w celu wykonania. Zapobiega to przekazywaniu tego samego zadania innemu przykładowi rytmu selera.

Używamy MongoDB jako zaplecza naszych zaplanowanych zadań. Oto przykładowy dokument pokazujący, że zadanie zostało zarezerwowane przez jeden z programów planujących.

{ 
    "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

Nie mogę odtworzyć tego zachowania z "DatabaseScheduler" _djcelery_.Używam harmonogramu interwałowego 'timedelta (sekundy = 5)' i bazy danych _SQLite_ do testowania. Zadania są wstawiane do kolejki i przetwarzane dwukrotnie, jeśli są uruchomione dwa procesy "bitowe". – Feuermurmel

+1

Mogę się mylić, ale czy ten proces "rezerwacji" nie jest właśnie użyty, aby wielu pracowników nie wykonywało * tej samej * pracy? Nie ma to nic wspólnego z synchronizowaniem wielu programów planujących, aby nie uruchamiały duplikatów zadań. – Ian

+1

@Feuermurmel Potwierdzam to. Celerybeat musi być uruchamiany tylko raz. –

0

Właśnie znalazłem to rozwiązanie jako zamiennik seler-beat: RedBeat, blog post

nie używaliśmy go jeszcze chociaż.

Powiązane problemy