Перегрузка команд 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.
Заранее спасибо!