Celeryd запускает несколько демонов

Я пытаюсь использовать Celery с серверной частью RabbitMQ для запуска асинхронных фоновых задач в Fedora, и я нахожу это удручающе ненадежный. Самая большая проблема заключается в том, что он иногда запускает одну и ту же задачу несколько раз, и мне трудно понять, почему.

Я не думаю, что мой код запускает задачу несколько раз, так как я тестировал, вручную запуская задачу (которая создает запись БД) один раз и вижу, что создаются две идентичные записи. Если я запускаю код из оболочки Django, создается только одна запись, поэтому проблема определенно связана с Celery.

У меня есть 3 сервера, на каждом из которых работает celeryd, и только первый работает rabbitmq, и все 3 сервера используют одну и ту же базу данных. Сначала я столкнулся с проблемой в настройках сельдерея, из-за которой celeryd на каждом сервере извлекал и выполнял одну и ту же задачу. Тем не менее, ничто в документах сельдерея, по-видимому, не различает настройку с одним хостом и несколькими хостами, поэтому, если я указал правильный BROKER_HOST/PORT/USER/PASSWORD/VHOST в моем settings.py для каждого сервера, он должен «просто работа" с несколькими хостами. Это правильно?

Другая мысль, которая у меня была, заключалась в том, что я мог бы каким-то образом запускать несколько экземпляров celeryd, хотя я не уверен, как это проверить. Два сервера работают под управлением Fedora 13, и когда я запускаю ps aux | grep .*.py, я получаю:

root     24806  0.1  1.8  51404 31328 ?        Sl   Oct19   9:25 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler
root     24900  0.1  1.6  51404 28592 ?        S    Oct19   6:02 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler
root     24901  0.3  9.4 183232 161948 ?       S    Oct19  22:32 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler

Означает ли это, что запущено 3 отдельных экземпляра celeryd? И если да, то это ошибка и надо ли убивать 2 из них?

На моем третьем сервере установлена ​​Fedora 17 с другой структурой служб. Когда я запускаю systemctl status celeryd.service, я получаю:

celeryd.service - LSB: celery task worker daemon
      Loaded: loaded (/etc/rc.d/init.d/celeryd)
      Active: active (exited) since Fri, 19 Oct 2012 10:59:38 -0400; 4 days ago
     Process: 732 ExecStop=/etc/rc.d/init.d/celeryd stop (code=exited, status=0/SUCCESS)
     Process: 738 ExecStart=/etc/rc.d/init.d/celeryd start (code=exited, status=0/SUCCESS)
      CGroup: name=systemd:/system/celeryd.service

Я не уверен, как это интерпретировать. «Активный» обычно работает, а «завершенный» обычно означает, что он не работает. Когда я запускаю ps aux | grep .*celery.*, я получаю только:

root     25142  0.0  0.0 109400   932 pts/0    S+   11:28   0:00 grep --color=auto .*celery.*

Значит ли это, что celeryd не работает, или я должен искать что-то еще?

Изменить: на основе этого ответа , я думаю, что 3 процесса могут быть по умолчанию.


person Cerin    schedule 23.10.2012    source источник
comment
Строка, которую я копирую, указывает на то, что вы используете несколько экземпляров celerybeat. Это правда? корень 24901 0,3 9,4 183232 161948 ? S Oct19 22:32 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l ПРЕДУПРЕЖДЕНИЕ --pidfile /var/run/celeryd.pid -B - -scheduler djcelery.schedulers.DatabaseScheduler   -  person James R    schedule 23.10.2012


Ответы (1)


Я написал в комментариях, но я убежден, что это ваша проблема, см. здесь:

root     24806  0.1  1.8  51404 31328 ?        Sl   Oct19   9:25 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler
root     24900  0.1  1.6  51404 28592 ?        S    Oct19   6:02 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler
root     24901  0.3  9.4 183232 161948 ?       S    Oct19  22:32 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler

Твой бегущий сельдерей с ударом трижды. Итак, вы отправляете битые сообщения три раза.

Вы должны либо только один экземпляр с включенным битом, либо (предпочтительно) запустить celerybeat самостоятельно и снять -B с экземпляров celeryd

person James R    schedule 23.10.2012
comment
Я только что нашел несколько документов, которые подтверждают вашу точку зрения о celerybeat. ask.github.com/celery/getting-started/periodic-tasks. html - person Cerin; 24.10.2012