Я пытаюсь использовать 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 процесса могут быть по умолчанию.