Python psycopg2.OperationalError:SSL系统调用错误:在Flask/SQLAclemy/芹菜+PostgreSQL应用程序上检测到EOF

Python psycopg2.OperationalError:SSL系统调用错误:在Flask/SQLAclemy/芹菜+PostgreSQL应用程序上检测到EOF,python,postgresql,flask,sqlalchemy,celery,Python,Postgresql,Flask,Sqlalchemy,Celery,我有一个应用程序是用Flask+SQLALchemy+Cellery编写的,RabbitMQ作为代理,数据库是PostgreSQL PostgreSQL 10.11 Ubuntu 10.11-1.pgdg16.04+1,在x86_64-pc-linux-gnu上,由gcc Ubuntu 5.4.0-6ubuntu1~16.04.12 5.4.0 20160609编译,64位。数据库托管在DigitalOcean 1 CPU、2Gb RAM中。所有应用程序工作人员都在主管处开始使用烧瓶或芹菜 在连

我有一个应用程序是用Flask+SQLALchemy+Cellery编写的,RabbitMQ作为代理,数据库是PostgreSQL PostgreSQL 10.11 Ubuntu 10.11-1.pgdg16.04+1,在x86_64-pc-linux-gnu上,由gcc Ubuntu 5.4.0-6ubuntu1~16.04.12 5.4.0 20160609编译,64位。数据库托管在DigitalOcean 1 CPU、2Gb RAM中。所有应用程序工作人员都在主管处开始使用烧瓶或芹菜

在连接到DB的项目中,我使用的flask_sqlalchemy包如下:

from flask_sqlalchemy import SQLAlchemy
from flask import Flask

# Init 
app = Flask(__name__)

# Create the connection to database
db = SQLAlchemy(app)
@celery.task(name='example_task', queue='default')
def example_task(payload):
    """ Some logic here """
    data = ExampleModel.query.filter(ExampleModel.id == payload["id"]).first()

    """ Some another app logic """
    db.session.add(SecondModel(payload))
    db.session.commit()
    
    return {"success": True}
我在Flask应用程序中编写了一些登录名,对其进行了测试,然后将其复制到芹菜项目中,在该项目中,db连接是相同的。现在我的芹菜任务示例如下所示:

from flask_sqlalchemy import SQLAlchemy
from flask import Flask

# Init 
app = Flask(__name__)

# Create the connection to database
db = SQLAlchemy(app)
@celery.task(name='example_task', queue='default')
def example_task(payload):
    """ Some logic here """
    data = ExampleModel.query.filter(ExampleModel.id == payload["id"]).first()

    """ Some another app logic """
    db.session.add(SecondModel(payload))
    db.session.commit()
    
    return {"success": True}
问题是,当我在笔记本电脑上运行我的应用程序时,一切正常,没有错误。当我在VPS上上传我的应用程序时,没有那么多用户,一切都很好。但一段时间后,当有30多个用户同时使用时,他们调用此示例_任务,在一些时间,错误开始周期性地出现在非常简单的查询中,用于从数据库中选择一些数据:

  File "/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
    context)
  File "/venv/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 509, in do_execute
    cursor.execute(statement, parameters)
psycopg2.OperationalError: SSL SYSCALL error: EOF detected

The above exception was the direct cause of the following exception:

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) SSL SYSCALL error: EOF detected
 [SQL: 'SELECT example_model.id AS example_model_id, example_model.key AS example_model_key
 \nFROM example_model \nWHERE example_model.id = %(id_1)s \n LIMIT %(param_1)s'] [parameters: {'id_1': 2, 'param_1': 1}] (Background on this error at: http://sqlalche.me/e/e3q8)
有时,但我在日志中很少看到这种错误:

psycopg2.OperationalError: SSL error: decryption failed or bad record mac
我编写了一个处理错误的示例异常装饰器,例如任何错误,而不仅仅是SQLAlchemy错误,在它捕获错误后,我执行db.session.rollback

def exception_log(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as err:
            # Do the rollback
            db.session.rollback()

            # Call function again
            return func(*args, **kwargs)
但它并没有帮到我,因为是的,它重新加载了db的连接,功能工作正常,但应用程序开始工作越来越慢,在某个时候,我应该在Supervisor中重新加载工作人员。我在PostgreSQL中看到了很多空闲连接,我将空闲事务超时设置为5分钟,但没有帮助

SET SESSION idle_in_transaction_session_timeout = '5min';

我不知道下一步该怎么办,因为现在唯一有帮助的解决方案是,每当我看到应用程序运行越来越慢时,就在supervisor中重新加载应用程序工作人员。

我使用托管Postgres数据库服务时遇到了同样的问题,似乎时不时会中断连接

psycopg2.OperationalError:SSL系统调用错误:检测到EOF

谢天谢地,SQLAlchemy似乎有助于解决这一问题的旗帜

传递pre_ping=True以创建_引擎,它将在将所有池连接用于实际查询之前检查它们

悲观方法是指在每次连接池签出开始时对SQL连接发出一条测试语句,以测试数据库连接是否仍然可行。通常,这是一个类似“SELECT 1”的简单语句,但也可以使用某些特定于DBAPI的方法来测试连接的活跃性


我通过将Flask SQLAlchemy软件包升级到最新的vervion解决了这个问题。

您使用的是psycopg2还是psycopg2二进制?@snakecharmerb我已经安装了这两个软件包。