已达到Django Celery Max DB连接

问题描述 投票:3回答:1

我正在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 worker正在关闭数据库连接?

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数据库设置:

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

我如何启动部署的Django服务器

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

gunicorn配置

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 并且据我了解芹菜工作者也应注意这一点。

python django celery django-celery
1个回答
0
投票

可能是您可以开始某种类型的缓冲池,还是故意启动和关闭连接可能有所帮助。通过此https://code.i-harness.com/en/q/2263d77,讨论的是关于dB连接池以及为芹菜任务创建/关闭连接。我自己还没有尝试过。

© www.soinside.com 2019 - 2024. All rights reserved.