Установлено соединение с Django Celery Max DB - PullRequest
1 голос
/ 17 апреля 2019

Я выполняю задачи на своем рабочем из сельдерея в приложении django, где выполнение каждой задачи занимает около 1-2 секунд.Обычно это хорошо, но время от времени, особенно если приложение Django было развернуто какое-то время, я начинаю видеть ошибки, подобные этой:

File "/usr/lib64/python3.6/site-packages/sqlalchemy/pool/base.py", line 428, in __init__
    self.__connect(first_connect_check=True)
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/pool/base.py", line 630, in __connect
    connection = pool._invoke_creator(self)
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect
    return dialect.connect(*cargs, **cparams)
  File "/usr/lib64/python3.6/site-packages/sqlalchemy/engine/default.py", line 453, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "/usr/lib64/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL:  remaining connection slots are reserved for non-replication superuser connections

, которая указывает мне, что работник Celery не закрываетсясоединения правильно.

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

Мой вопрос : Как я могу убедиться, что работник сельдерея закрывает соединения с БД?

Настройки сельдерея:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_proj.settings')

_celery_broker = settings.CELERY_BROKER
_result_backend = settings.RESULT_BACKEND

app = Celery('my_proj', broker=_celery_broker, backend=_result_backend)

app.autodiscover_tasks(['common'])

app.conf.update(
    worker_prefetch_multiplier=0,
    event_queue_ttl=0,
    task_acks_late=True,
)

Мои настройки Django DB:

'DATABASES': {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': <...>,
        'USER': <...>,
        'PASSWORD': <...>,
        'HOST': <...>,
        'PORT': 5480,
    }
}

Как запустить мой развернутый сервер Django

gunicorn --config gunicorn.config my_proj.wsgi:application

gunicorn config

bind = '0.0.0.0:8201'
workers = 3
worker_class = 'gthread'
threads = 3
limit_request_line = 0
timeout = 1800

Как я запускаю своего сельдерея:

celery -A my_proj worker -l info

Я прочитал в Django документах, что, если не указано, настройка MAX_CONN_AGE по умолчанию 0 и, насколько я понимаю, работник сельдерея тоже должен это поднять.

...