Задачи Celery перестали выполняться в приложении Django, развернутом с помощью Heroku
У нас есть Django-сайт, развернутый на Heroku (бесплатный план) с конкретным приложением для веб-краулеров, которое использует Celery и Redis. В этом приложении есть задачи Celery, которые добавляют записи в нашу БД Postgres. Все работало хорошо, пока пару дней назад мы не обновили некоторые модели и миграции из другого несвязанного приложения, и внезапно все задачи перестали выполняться (периодические задачи регистрируются, но не выполняются). Весь сайт подключен к Sentry, и мы не получали никаких флагов ошибок. Мы ничего не меняли в важных файлах (таких как settings, production config, requirements, tasks или procfile). Локально все работает нормально.
Мы пробовали несколько вещей, например, исключить все зарегистрированные задачи из админки Django и поставить их снова. Тестирование в разное время. Откатывались на несколько недель назад, до миграции, чтобы посмотреть, выполняются ли задания... Но, похоже, ничего не работает, и мы чувствуем отчаяние, поскольку без рабочих мы вынуждены вручную скрести несколько сайтов.
Мы считаем, что проблема кроется в инициализации celery beat, и здесь приводится лог.
Админ Django: django admin для периодических задач
Procfile:
release: python manage.py migrate
web: newrelic-admin run-program gunicorn config.wsgi:application
worker: newrelic-admin run-program celery -A config --beat worker -l INFO
Celery.py (в нашем случае он называется Celery_app.py):
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
DJANGO_ENV = os.getenv("DJANGO_ENV", default="production")
if DJANGO_ENV == "production":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")
elif DJANGO_ENV == "test":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.test")
elif DJANGO_ENV == "local":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
else:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")
app = Celery("our_app_name")
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object("django.conf:settings", namespace="CELERY")
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
рабочие дино логи:
Мы не можем понять, почему рабочий показывает эту ошибку "django.db.utils.OperationalError: could not receive data from server: Bad file descriptor" или как ее решить, но мы можем добавлять новые записи в нашу БД просто отлично, web dyno работает, и нет никаких ошибок при развертывании новых версий.
Может ли кто-нибудь помочь мне с этим? Я буду рад поделиться дополнительной информацией, чтобы решить этот вопрос :)