Код: Выделить всё
# Celery settings
CELERY_BROKER_URL = 'redis://redis:6379/1'
CELERY_RESULT_BACKEND = 'redis://redis:6379/2'
CELERY_BROKER_POOL_LIMIT = 10
CELERY_REDIS_MAX_CONNECTIONS = 10
CELERY_BROKER_TRANSPORT_OPTIONS = {'max_connections': 10}
CELERY_RESULT_BACKEND_TRANSPORT_OPTIONS = {'max_connections': 10}
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
WORKER_MAX_MEMORY_PER_CHILD_KB = 200_000
CELERY_WORKER_MAX_MEMORY_PER_CHILD = 200_000
CELERY_WORKER_MAX_TASKS_PER_CHILD = 1000
CELERY_BEAT_SCHEDULE = celery_beat_schedule
CELERY_TASK_DEFAULT_QUEUE = 'default'
CELERY_TASK_QUEUES = (
Queue('default'),
Queue('bind_status'),
)
CELERY_ONCE = {
'backend': 'celery_once.backends.Redis',
'settings': {
'url': "redis://redis:6379/3",
'default_timeout': 60*60,
}
}
app = Celery('')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.conf.worker_send_task_events = True
app.conf.task_send_sent_event = True
app.conf.task_track_started = True
app.conf.result_extended = True
app.conf.broker_connection_retry_on_startup = True
app.autodiscover_tasks()
Код: Выделить всё
celery -A d worker -Q bind_status --loglevel=info -P gevent -c 4
Учитывая настройки max_connections=10, я ожидал, что общее количество TCP-подключений к Redis (брокер + серверная часть результатов) составит около 10–20, особенно при concurrency=4.
Наблюдаемое поведение
Когда я проверяю количество подключений к Redis DB 2 (используется в качестве серверной части результатов), я вижу сотни подключений (100–400), хотя установлены ограничения `max_connections`.
Вопросы
- Почему Celery создает так много подключений, несмотря на ограничения max_connections?
- Как я могу правильно ограничить количество TCP-соединений при использовании Redis в качестве серверной части результата с gevent Workers?
- Есть ли способ сделать пул соединений фактически общим для всех гринлетов и рабочих?
Подробнее здесь: https://stackoverflow.com/questions/798 ... ite-max-co
Мобильная версия