Задачи 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 работает, и нет никаких ошибок при развертывании новых версий.

Может ли кто-нибудь помочь мне с этим? Я буду рад поделиться дополнительной информацией, чтобы решить этот вопрос :)

Вернуться на верх