Celery опрашивает Redis каждую секунду

У меня есть приложение Django с двумя установленными задачами celery. Обе задачи должны запускаться только один раз в одну минуту после полуночи (12:01 AM). Это нужно только для обновления некоторых статусов, которые меняются с "ACTIVE" на "INACTIVE" в 12:01 AM.

Моя цель - уменьшить количество раз, когда Celery опрашивает Redis. В настоящее время он опрашивает Redis каждую секунду, что проблематично.

Я сделал три шага

  1. Я пытался изменить настройки в 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
    
  2. Во-вторых, я даже попытался настроить динамический опрос, чтобы график опроса был более частым в ночное время и снова уменьшался

    .
    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.")
    
  3. И наконец, поскольку у меня установлен Django Celery Beat, я попробовал изменить настройки непосредственно в разделе "Intervals" и "Crontabs", но и это не помогло

    .

Несмотря на все эти усилия, Celery по-прежнему опрашивает Redis каждую секунду. Я проверил документацию на предмет оптимизации, но с трудом нашел там решение https://docs.celeryq.dev/en/stable/userguide/optimizing.html

Следующая статья была также направлена на то, чтобы я мог сделать все наоборот, но это тоже не сработало

Можно ли использовать сельдерей для каждой второй задачи?

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