Работники Celery перестают получать задания после определенного периода без ошибок
Я использую Celery beat и workers для планирования задач в проекте Django. В качестве брокера используется Redis. Я демонизировал его с помощью systemd.
Настройки проекта Django для Celery
# Celery application definition
CELERY_BROKER_URL = "redis://localhost:6379"
CELERY_ACCEPT_CONTENT = ["application/json"]
CELERY_TASK_SERIALIZER = "json"
CELERY_TIMEZONE = "UTC"
CELERY_MAX_TASKS_PER_CHILD = 1
CELERY_IGNORE_RESULT = True
# Celery periodic task schedule
CELERY_BEAT_SCHEDULE = {
"task-1": {
"task": "project.apps.app1.tasks.task_no_1",
"schedule": datetime.timedelta(seconds=5),
},
"task-2": {
"task": "project.core.tasks.task_no_2",
"schedule": datetime.timedelta(seconds=10),
},
"task-3": {
"task": "project.apps.app1.tasks.task_no_3",
"schedule": datetime.timedelta(seconds=10),
},
"task-4": {
"task": "project.apps.app1.tasks.task_no_4",
"schedule": datetime.timedelta(seconds=5),
},
"task-5": {
"task": "project.apps.app1.tasks.task_no_5",
"schedule": datetime.timedelta(seconds=10),
},
"task-6": {
"task": "project.apps.app1.tasks.task_no_6",
"schedule": datetime.timedelta(seconds=30),
},
"task-7": {
"task": "project.apps.app1.tasks.task_no_7",
"schedule": datetime.timedelta(seconds=30),
},
}
/etc/default/celeryd
# Name of nodes to start
CELERYD_NODES="worker1 worker2"
# Absolute or relative path to the 'celery' command:
CELERY_BIN="/home/adnan/project/env/bin/celery"
# App instance to use
# comment out this line if you don't use an app
CELERY_APP="project.core"
# How to call manage.py
CELERYD_MULTI="multi"
CELERYD_USER="adnan"
CELERYD_GROUP="www-data"
CELERYD_LOG_LEVEL="INFO"
# - %n will be replaced with the first part of the nodename.
# - %I will be replaced with the current child process index
# and is important when using the prefork pool to avoid race conditions.
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
# Options for Celery Beat
CELERYBEAT_PID_FILE="/var/run/celery/beat.pid"
CELERYBEAT_LOG_FILE="/var/log/celery/beat.log"
CELERY_CREATE_DIRS=1
RuntimeDirectory=celery
/etc/systemd/system/celerybeat.service
[Unit]
Description=Celery Beat Service
After=network.target
[Service]
Type=simple
User=adnan
Group=www-data
EnvironmentFile=/etc/default/celeryd
WorkingDirectory=/home/adnan/project
ExecStart=/bin/sh -c '${CELERY_BIN} \
-A ${CELERY_APP} beat --scheduler django_celery_beat.schedulers:DatabaseScheduler \
--pidfile=${CELERYBEAT_PID_FILE} \
--logfile=${CELERYBEAT_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL}'
Restart=always
[Install]
WantedBy=multi-user.target
/etc/systemd/system/celeryd.service
[Unit]
Description=Celeryd Service
After=network.target
[Service]
Type=forking
User=adnan
Group=www-data
EnvironmentFile=/etc/default/celeryd
WorkingDirectory=/home/adnan/project
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} \
--logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'
[Install]
WantedBy=multi-user.target
Проблема, с которой я столкнулся, заключается в том, что через несколько дней Celery workers перестают получать задания, хотя Celery beat продолжает отправлять задания.
В /var/log/celery/ нет журнала ошибок или следов отказа рабочих. Из /var/log/celery для worker1 & worker2, обнаружил, что worker1 перестал получать задания 28 декабря 2021 года и worker2 перестал получать задания сегодня 5 января 2022 года. Я проверил статус celerybeat.service и celeryd.service, оба они показывают Active и никаких следов ошибки.
Также проверено sudo journalctl -u celeryd.service, sudo journalctl -u celerybeat.service, ошибок нет.