Почему celery выдает ошибку соединения с базой данных, хотя на сервере баз данных активен пул соединений - PullRequest
0 голосов
/ 18 марта 2020

В настоящее время у меня возникла проблема с моим веб-приложением. У меня есть веб-приложение, созданное с django вместе с сельдереем для некоторых фоновых задач. Рабочий процесс - клиент загружает изображение, а затем некоторая обработка выполняется в задаче сельдерея, например, вызов API и обновление базы данных. Затем клиент запрашивает результат, и если задача выполнена, результат передается в качестве ответа.

Я использую управляемую DigitalOcean postgresql db и использую пул соединений. Для очереди сообщений сельдерея я использую rabbitmq и redis в качестве сервера внутренних результатов. Поскольку большая часть моей задачи связана с вводом / выводом, я использую gevent для сельдерея, чтобы я мог без проблем получать параллельные запросы. Мой сервер имеет 2vcpu, 4 ГБ оперативной памяти, 25 ГБ SSD.

Сначала, когда пул соединений не был активирован в БД, мы подвергли стресс-тестированию примерно 100 загруженных изображений одновременно и получили «FATAL: оставшиеся слоты соединений зарезервированы для соединений суперпользователя без репликации». После того, как некоторые исследования показали, что это было связано с пересечением лимита подключения БД, я использовал пул соединений. Тогда не было проблем для django. Но странно, сельдерей выдавал ту же ошибку при обновлении базы данных.

Моя команда сельдерея (из состояния systemctl):

/home/***/venv/bin/python3 -m celery worker -A app_name --loglevel=WARNING -P gevent -c 1000 --logfile=/var/log/celery/worker%I.log --pidfile=/home/***/worker.pid --hostname=worker@ubuntu**

После выполнения следующей команды я нашел рабочий номер сельдерея, но не знаю, почему это 1 и 12.

ps -ef | grep celery | grep -v grep | wc -l

результат: 1

ps -eLf | grep celery | grep -v grep | wc -l

результат: 12

Мой вопрос:

  1. Как сельдерей устанавливает соединение с базой данных?
  2. Почему для сельдерея есть 12 субработников?
  3. Создается ли 1000 зеленых нитей для каждых 12 рабочих? означает общий поток 12000?
  4. Почему сельдерей получает ошибку соединения с БД, даже если пул соединений с БД активирован?

Я новичок ie в этой области, поэтому, если вы могли бы объяснить это в деталях, это было бы очень признательно. Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...