Запуск celery worker создает слишком много связей с redis

#django #redis #celery

Вопрос:

Я использую сельдерей с redis в качестве брокера в проекте django.

Проблема, с которой я сталкиваюсь, заключается в том, что даже при отсутствии запущенной задачи простой запуск работника создает до 10 новых подключений к серверу redis.

 celery -A proj worker -l INFO
 

Если я зарегистрируюсь CLIENT LIST в redis-cli, я увижу это:

 127.0.0.1:6379> CLIENT LIST

id=272 addr=127.0.0.1:48846 fd=16 name= age=63 idle=63 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20520 events=r cmd=sadd user=default
id=270 addr=127.0.0.1:48842 fd=14 name= age=64 idle=64 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20520 events=r cmd=publish user=default
id=4 addr=127.0.0.1:46946 fd=8 name= age=14901 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 argv-mem=10 obl=0 oll=0 omem=0 tot-mem=61466 events=r cmd=client user=default
id=265 addr=127.0.0.1:48832 fd=9 name= age=64 idle=0 flags=b db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20536 events=r cmd=brpop user=default
id=266 addr=127.0.0.1:48834 fd=10 name= age=64 idle=63 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20520 events=r cmd=sadd user=default
id=273 addr=127.0.0.1:48848 fd=17 name= age=63 idle=2 flags=P db=2 sub=0 psub=1 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 events=r cmd=psubscribe user=default
id=274 addr=127.0.0.1:48850 fd=18 name= age=63 idle=63 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20520 events=r cmd=sadd user=default
id=267 addr=127.0.0.1:48836 fd=11 name= age=64 idle=64 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20496 events=r cmd=ping user=default
id=268 addr=127.0.0.1:48838 fd=12 name= age=64 idle=2 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20520 events=r cmd=publish user=default
id=269 addr=127.0.0.1:48840 fd=13 name= age=64 idle=64 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20496 events=r cmd=ping user=default
id=271 addr=127.0.0.1:48844 fd=15 name= age=63 idle=14 flags=P db=2 sub=0 psub=1 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 events=r cmd=ping user=default
 

Я пытался изменить --concurrency=1 , а также CELERY_BROKER_POOL_LIMIT=None и BROKER_TRANSPORT_OPTIONS = {'max_connections': 1} , но, похоже, никто не меняет количество подключений к redis.

Мой вопрос в том, что создает все эти связи и для чего именно ?

Ответ №1:

Мой вопрос в том, что создает все эти связи и для чего именно ?

Все соединения создаются одновременно, объединяются в пул и сохраняются среди всех создаваемых вами задач. Так что это нормально, что все соединения начинаются сразу. Использование пула соединений более эффективно, потому что соединения можно использовать повторно-создание новых соединений сопряжено с большими накладными расходами, поэтому полезно создавать соединения заранее и поддерживать их.

Поскольку соединения объединены в пул, изменение --concurrency не имеет никакого эффекта; если вы добавите больше параллелизма, они все равно будут использовать один и тот же пул соединений с одинаковым количеством подключений.

Отдельные задачи (гринлеты) должны использовать подключение redis для подтверждения задач, например, в рамках обычного рабочего процесса брокера.

Есть ли причина, по которой вам нужно менее 10 подключений (по умолчанию)?

Если вы пытаетесь ограничить количество подключений, вы не должны устанавливать CELERY_BROKER_POOL_LIMIT=None . Это, скорее всего, приведет к созданию большего количества подключений при фактическом выполнении задач, поскольку установка этого значения None приведет к тому, что новое соединение будет устанавливаться каждый раз, когда потребуется подключение к redis, а затем немедленно закрываться. Это добавляет много накладных расходов и в большинстве случаев не является хорошей идеей.

Кроме того, все настройки сельдерея должны иметь префикс CELERY_ при установке в настройках django. Так что вам CELERY_BROKER_TRANSPORT_OPTIONS не следует использовать BROKER_TRANSPORT_OPTIONS .

Комментарии:

1. Спасибо за ваш ответ, мне нужно было, чтобы количество подключений было низким, потому что я уже использую 12 подключений на heroku с максимальным количеством подключений 20, предлагаемых бесплатным планом redis. Я понимаю, что мне, возможно, потребуется обновление, но сколько подключений я должен запланировать, учитывая, что я также хочу использовать работника beat (для запланированных задач) и flower для мониторинга.