Сельдерей получает незарегистрированное задание от сельдерея, которым управляет systemd - PullRequest
2 голосов
/ 17 июня 2019

На моем промежуточном сервере у меня был рабочий-сельдерей (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, что, очевидно, не является решением, но сужает количество возможных недостатков

1 Ответ

0 голосов
/ 18 июня 2019

Было бы грубо оставить вопрос без ответа, хотя ответ приходит от меня, вот он:

Если кто-то когда-либо столкнется с такой проблемой, после следующего шага, указанного мной выше, попробуйте проверитьдля разрешений каталогов, которые использует celery и celerybeat - возможно, вы создали их с правами root, что может привести к указанной проблеме.Удачи всем в будущем!

...