Celery опрашивает Redis каждую секунду
У меня есть приложение Django с двумя установленными задачами celery. Обе задачи должны запускаться только один раз в одну минуту после полуночи (12:01 AM). Это нужно только для обновления некоторых статусов, которые меняются с "ACTIVE" на "INACTIVE" в 12:01 AM.
Моя цель - уменьшить количество раз, когда Celery опрашивает Redis. В настоящее время он опрашивает Redis каждую секунду, что проблематично.
Я сделал три шага
Я пытался изменить настройки в Django для Celery, в том числе используя такие параметры, как
.CELERY_IGNORE_RESULT
,CELERY_WORKER_CONCURRENCY
,CELERY_BROKER_HEARTBEAT
и, наконец,CELERY_BEAT_MAX_LOOP_INTERVAL
CELERY_RESULT_BACKEND = None CELERY_IGNORE_RESULT = True # Ignore task results to reduce Redis usage CELERY_ACCEPT_CONTENT = ["json"] CELERY_TASK_SERIALIZER = "json" CELERYD_PREFETCH_MULTIPLIER = 1 # Fetch only 1 task at a time CELERY_ACKS_LATE = True # Acknowledge tasks after completion to avoid re-execution on failure # Celery transport options CELERY_BROKER_TRANSPORT_OPTIONS = { 'ssl': { 'ssl_cert_reqs': ssl.CERT_NONE # Suggestion: CERT_REQUIRED for stronger security }, 'visibility_timeout': 3600, # Timeout for long-running tasks 'polling_interval': 30 # Poll every 30 seconds } CELERY_RESULT_BACKEND_TRANSPORT_OPTIONS = { 'ssl': { 'ssl_cert_reqs': ssl.CERT_NONE # Same as broker for consistency } } # Reduce the number of threads/processes CELERY_WORKER_CONCURRENCY = 1 # Disable sending task events CELERY_WORKER_SEND_TASK_EVENTS = False # Disable remote control commands CELERY_WORKER_ENABLE_REMOTE_CONTROL = False # Disable broker heartbeat messages CELERY_BROKER_HEARTBEAT = None CELERY_BEAT_MAX_LOOP_INTERVAL = 3600 # Check for scheduled tasks every hour
Во-вторых, я даже попытался настроить динамический опрос, чтобы график опроса был более частым в ночное время и снова уменьшался
.def set_polling_interval(): now = datetime.now() if now.hour == 23 and now.minute >= 59 or now.hour == 0 and now.minute <= 15: # Between 11:59 PM and 12:15 AM, poll more frequently app.conf.broker_transport_options = {'polling_interval': 30} # Poll every 30 seconds logger.info("Polling every 30 seconds between 11:59 PM and 12:15 AM.") else: # During the rest of the day, poll less frequently (every 24 hours) app.conf.broker_transport_options = {'polling_interval': 86400} # Poll every 24 hours logger.info("Polling every 24 hours outside the midnight window.")
И наконец, поскольку у меня установлен Django Celery Beat, я попробовал изменить настройки непосредственно в разделе "Intervals" и "Crontabs", но и это не помогло
.
Несмотря на все эти усилия, Celery по-прежнему опрашивает Redis каждую секунду. Я проверил документацию на предмет оптимизации, но с трудом нашел там решение https://docs.celeryq.dev/en/stable/userguide/optimizing.html
Следующая статья была также направлена на то, чтобы я мог сделать все наоборот, но это тоже не сработало
Можно ли использовать сельдерей для каждой второй задачи?