Перегрузка команд Celery и Redis, несмотря на оптимизацию в приложении Django

Я столкнулся с проблемой в моей настройке Celery + Redis для проекта Django, где количество выполняемых команд Redis резко возрастает, несмотря на то, что я сделал несколько оптимизаций. Я использую Upstash Redis с бесплатным тиером, который имеет суточный лимит в 10 000 команд. Однако уже через час после запуска приложения я получаю тысячи команд Redis, в основном BRPOP, PUBLISH и PING. Это происходит даже тогда, когда приложение простаивает.

Контекст: Django Версия: 4.2 Celery Версия: 5.4 Брокер Redis: Upstash Redis Free Tier Развертывание: DigitalOcean (платформа для приложений) Детали приложения: Приложение в основном используется для планирования и отправки писем-напоминаний с помощью задач Celery. Вот краткий обзор:

У меня есть Celery workers, запущенные для задач отправки электронной почты. Нет никакой настройки celery.beat. Задачи вызываются по требованию логикой приложения. Приложение большую часть времени находится в состоянии относительного простоя, а задачи запускаются лишь несколько раз в день. Оптимизации, которые я уже пробовал: Бэкенд результатов отключен: Я установил CELERY_RESULT_BACKEND = None, чтобы избежать ненужных чтений из Redis. Регулировка сердцебиения: Я увеличил CELERY_BROKER_TRANSPORT_OPTIONS['heartbeat'] до 120 секунд, надеясь, что это снизит нагрузку на команды. Множитель префетча: Установите CELERY_WORKER_PREFETCH_MULTIPLIER = 1, чтобы обеспечить одновременное получение рабочими только одной задачи. Конфигурации SSL: Включите SSL в опциях транспорта, как рекомендует Upstash:


CELERY_BROKER_TRANSPORT_OPTIONS = {
    'visibility_timeout': 3600,
    'ssl': {
        'ssl_cert_reqs': 'CERT_REQUIRED',
        'ssl_ca_certs': BASE_DIR / 'certs/upstash-ca-chain.pem',
    },
    'heartbeat': 120,
}

Даже при такой оптимизации использование команд Redis быстро возрастает до тысяч команд в течение часа, даже если приложение не выполняет активных задач. Например, за последний час Redis зарегистрировал более 1 000 команд BRPOP, 525 команд PUBLISH и несколько команд PING и AUTH.

Ниже приведен график использования команд Redis за последний час:

Нарушение работы команды Redis (в течение 1 часа): BRPOP: 1,000 команд PUBLISH: 525 команд PING: 67 команд AUTH: 36 команд Другие команды, такие как LLEN, MULTI, EXISTS и т.д.

Нормально ли, что Celery workers генерирует такое количество команд Redis, даже когда приложение простаивает? Что может быть причиной такого высокого использования команд BRPOP и PUBLISH? Есть ли дополнительные оптимизации, которые я могу сделать, чтобы снизить нагрузку на Redis? Может ли переход с Upstash на полностью управляемый экземпляр Redis на DigitalOcean (или где-нибудь еще) помочь снизить нагрузку на команды, или это поведение не связано с провайдером Redis? Любые соображения или советы будут очень признательны! Я надеюсь остаться в рамках бесплатного уровня и при этом обеспечить эффективное выполнение моих задач Celery.

Заранее спасибо!

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