#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 для мониторинга.