我正在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 并且据我了解芹菜工作者也应注意这一点。
可能是您可以开始某种类型的缓冲池,还是故意启动和关闭连接可能有所帮助。通过此https://code.i-harness.com/en/q/2263d77,讨论的是关于dB连接池以及为芹菜任务创建/关闭连接。我自己还没有尝试过。