Celery worker прекращает выполнение заданий через несколько минут после неудачной синхронизации
В моем проекте django возникла проблема с использованием celery и redis в качестве брокера сообщений.
Current versions:
celery==5.3.6
redis==5.0.8
Проблему можно описать с помощью этого журнала:
Это происходит как в docker, так и в системе aws, когда я развертываю контейнер. Сразу после развертывания или составления контейнера, если я даю системе задания на выполнение, она прекрасно их выполняет, но если я оставляю ее неиспользованной на пару минут, она ломается, как написано в журнале.
В настоящее время я использую эту конфигурацию на docker-compose:
celery:
<<: *app
command: celery -A core worker --without-mingle --without-gossip --without-heartbeat --pool=solo -l info -Q celery,celery:1,celery:2,celery:3
ports:
- 5554:5554
depends_on:
- db
- redis
и эта конфигурация на celery.py:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')
# Initialize Celery application.
app = Celery('core')
# Load task-related settings from the Django project settings using the 'CELERY' namespace.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Ensure broker connection retries on startup for Celery 6.0 and above.
app.conf.broker_connection_retry_on_startup = True
# Broker transport options for message priority and task routing strategy.
app.conf.broker_transport_options = {
'priority_steps': list(range(10)),
'sep': ':',
'queue_order_strategy': 'priority',
}
# Limit task prefetching to one task at a time to balance worker load.
app.conf.worker_prefetch_multiplier = 1
app.conf.task_soft_time_limit = 1200 # 20 minutes
app.conf.task_time_limit = 1500 # 25 minutes, hard limit
app.conf.broker_heartbeat = 30 # Increase Redis heartbeat check interval
app.conf.broker_connection_timeout = 10 # Time in seconds to wait for connection
app.conf.broker_connection_retry_on_startup = True # Ensure retries
app.conf.task_acks_late = True # Acknowledge task only after completion
app.conf.task_reject_on_worker_lost = True # Reject task if worker is lost
app.conf.task_default_retry_delay = 300 # Retry after 5 minutes
app.conf.task_max_retries = 5 # Max retries for failed tasks
# Automatically discover tasks from installed apps (tasks.py).
app.autodiscover_tasks()