На моем промежуточном сервере у меня был рабочий-сельдерей (4.3.0), работающий с битом сельдерея в качестве демонов через systemd с RabbitMQ в качестве брокера. Все было в порядке в течение нескольких недель, за исключением одного момента 4 дня назад, когда произошла какая-то ошибка соединения между сельдереем и amqp через kombu. [Errno 104] Connection reset by peer after started
Я не обращал особого внимания на журналы сервера, поскольку проект находится на стадии WiP, однако когда я попытался развернуть новейшую версию кода, я понял, что с работником что-то не так.
Я погуглил проблему, и вот что выскочило:
https://github.com/celery/celery/issues/4867
Простым решением было понизить версию сельдерея до 4.1.1 и дождаться исправления в будущих стабильных выпусках.
Я удалил сельдерей, amqp, биллиард и комбу из моего venv, установил celery.4.1.1, который установил вышеуказанные пакеты в соответствующих версиях.
Сервисы atm для сельдерея и сельдерея активны, celerybeat отправляет задачи работнику сельдерея, однако в журналах сельдерея отображается сообщение об ошибке (см. Код ошибки сельдерея после перехода на более раннюю версию). Это странно, потому что я ничего не изменил в объявлениях задач или моих настройках (что может быть проблемой здесь).
Самое странное, что если я выключаю системные службы и запускаю их с комендом:
celery -A celery_cfg:app worker -B --loglevel=DEBUG
Все текущие задачи выполняются как прошлые. Таким образом, конфиги сельдерея и сельдерея, как они, кажется, работают.
Несколько заостренных подходов, которые я пробовал:
1) Обязательно импортировать все модули без импорта родственников.
2) В прошлом встречались проблемы с отсутствующими пакетами в venv -> они актуальны
3) Перезагрузка сельдерея / сельдерея / gunicorn / systemd / rabbitmq и самого сервера
4) Дважды проверил пути в сервисах systemd (однако, возможно, я отлаживаю это долго, и я просто не вижу опечатку или что-то в этом роде)
5) Пробовал с развивающей версией 4.4.0rc2
, (работник сельдерея не встает)
6) Установленные приложения содержат все необходимые приложения
Сообщение об ошибке после понижения версии сельдерея
`2019-06-16 19:35:00,092: ERROR/MainProcess] Received unregistered task of type 'apps.mailing.tasks.execute_sending_system_mail'.
The message has been ignored and discarded.
Did you remember to import the module containing this task?
Or maybe you're using relative imports?
Please see
http://docs.celeryq.org/en/latest/internals/protocol.html
for more information.
The full contents of the message body was:
'[[], {}, {"callbacks": null, "errbacks": null, "chain": null, "chord": null}]' (77b)
Traceback (most recent call last):
File "/home/user/apps/venv/loans/lib/python3.7/site-packages/celery/worker/consumer/consumer.py", line 557, in on_task_received
strategy = strategies[type_]
KeyError: 'apps.mailing.tasks.execute_sending_system_mail'
Сервисный код сельдерея Systemd
Description=Celery Service
After=network.target
[Service]
Type=forking
User=<user>
Group=<user>
EnvironmentFile=/etc/default/celery
WorkingDirectory=/home/<user>/apps/loans
ExecStart=/bin/sh -c '${CELERY_BIN} multi start ${CELERYD_NODES} \
-A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
--logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \
--pidfile=${CELERYD_PID_FILE}'
ExecReload=/bin/sh -c '${CELERY_BIN} multi restart ${CELERYD_NODES} \
-A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
Сервисный код Celery Beat Service System
Description=Celery Beat Service
After=network.target
[Service]
Type=simple
User=user
Group=user
EnvironmentFile=/etc/default/celery
WorkingDirectory=/home/user/apps/loans
ExecStart=/bin/sh -c '${CELERY_BIN} beat \
-A ${CELERY_APP} --pidfile=${CELERYBEAT_PID_FILE} \
--logfile=${CELERYBEAT_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL}'
[Install]
WantedBy=multi-user.target
Conf файл для переменных
CELERYD_NODES="w1"
CELERY_BIN="/home/user/apps/venv/loans/bin/celery"
CELERY_APP="celery_cfg:app"
CELERYD_MULTI="multi"
CELERYD_OPTS=""
CELERYD_PID_FILE="/home/user/apps/pids/celery/%n.pid"
CELERYD_LOG_FILE="/home/user/apps/logs/celery/%n%I.log"
CELERYD_LOG_LEVEL="INFO"
CELERYBEAT_PID_FILE="/home/user/apps/pids/celery/beat.pid"
CELERYBEAT_LOG_FILE="/home/user/apps/logs/celery/beat.log"
файл celery_cfg
app = Celery('loans_apps')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
app.set_default()
# <====CELERY BEAT PERIODIC TASKS ====>
app.conf.beat_schedule = {
'execute_sending_system_mail': {
'task': 'apps.mailing.tasks.execute_sending_system_mail',
'schedule': crontab(minute='*/5'),
'args': (),
},
}
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
незначительное сокращение настроек, содержащих переменные cfg сельдерея
BROKER_URL = 'amqp://localhost//',
CELERY_ENABLE_UTC = True
Я знаю, что могу попробовать установить сельдерей и сельдерея без systemd, однако я рассматриваю это как последнее средство решения. Я бы хотел сохранить конфу как есть, хотя я и понятия не имею, что там не так.
EDIT
По ошибке и руководствуясь моим другом, я только что узнал, что сервисы как сельдерея, так и сельдерея, кажется, работают нормально на пользователя root, что, очевидно, не является решением, но сужает количество возможных недостатков