在Heroku上使用Flask和Celery时出现的问题:sqlalchemy.exc.DatabaseError: (psycopg2.DatabaseError) SSL错误:解密失败或坏的记录MAC。

4
我正在尝试在Heroku上部署一个使用Celery后台任务的Flask应用程序。我已经实现了应用工厂模式,以便Celery进程不绑定到任何一个Flask应用程序实例。
这在本地运行良好,但是当部署到Heroku时,总是出现相同的结果:celery任务(我只使用一个)第一次成功运行,但是对该任务的任何后续celery调用都会失败,并显示sqlalchemy.exc.DatabaseError: (psycopg2.DatabaseError) SSL error: decryption failed or bad record mac。如果我重新启动celery worker,则循环继续。
多个 问题显示了相同的错误,但没有明确的解决方法。我最初认为实现应用工厂模式将防止此错误发生,但它还没有完全实现。
app/__init__.py文件中,我创建了celery和db对象:
celery = Celery(__name__, broker=Config.CELERY_BROKER_URL)
db = SQLAlchemy()

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])

    db.init_app(app)
    return app

我的flask_celery.py文件创建了实际的Flask应用程序对象:

import os
from app import celery, create_app

app = create_app(os.getenv('FLASK_CONFIG', 'default'))
app.app_context().push()

我使用以下命令启动celery:

celery worker -A app.flask_celery.celery --loglevel=info

这是实际的celery任务代码:

@celery.task()
def task_process_stuff(stuff_id):
    stuff = Stuff.query.get(stuff_id)
    stuff.processed = True
    db.session.add(stuff)
    db.session.commit()
    return stuff

被以下调用:

task_process_stuff.apply_async(args=[stuff.id], countdown=10)

库版本

  • Flask 0.12.2
  • SQLAlchemy 1.1.11
  • Flask-SQLAlchemy 2.2
  • Celery 4.0.2

只是为了确保您无法对数据库进行任何查询,对吧? - cbolles
@skagra_dragneel 第一次,我可以连接到数据库并且任务正常运行。然而,之后的任何时候,任务都会立即失败,无法执行任何对数据库的查询。 - Anconia
真糟糕,我以为我找到了解决方案,因为我遇到过类似的问题,但我根本无法连接到数据库。 - cbolles
你的Celery工作者一直在重复使用同一个连接。在提交会话后加上db.session.remove()怎么样?这应该会强制重新建立连接。 - Oluwafemi Sule
@OluwafemiSule 我尝试在提交后添加 db.session.remove(),但错误仍然存在。 - Anconia
1个回答

11

解决方法是在任务开始时添加db.engine.dispose(),即在任何工作开始之前处理所有的数据库连接:

@celery.task()
def task_process_stuff(stuff_id):
    db.engine.dispose()
    stuff = Stuff.query.get(stuff_id)
    stuff.processed = True
    db.session.commit()
    return stuff

由于我需要在所有任务中使用此功能,因此我将其添加到task_prerun中:

@task_prerun.connect
def on_task_init(*args, **kwargs):
    db.engine.dispose()

2
有人能解释一下这个问题的根本原因吗?为什么会影响Celery工作进程而不是Gunicorn工作进程? - pdoherty926
嗨,我遇到了同样的问题,但我找不到为什么会这样?这是关于celery工作进程的非常奇怪的行为... - simkusr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接