【问题标题】:How to recover from Django Celery dropped connection to Postgres如何从 Django Celery 断开与 Postgres 的连接中恢复
【发布时间】:2013-08-17 01:39:20
【问题描述】:

我正在运行带有 Redis 代理和数据库结果后端的 Django Celery,这与我用于主应用程序的 Postgres DB 相同。

最近我遇到了 Postgres 服务器重新启动并且工作进程失去其数据库连接的情况。发生这种情况后,即使数据库返回并且主 Django 站点正常响应,芹菜任务也不会再次成功。在处理任何内容之前,我需要重新启动 celeryd 进程。所有 celery 任务都报同样的错误:

DatabaseError: terminating connection due to administrator command
SSL connection has been closed unexpectedly

我知道当使用 db results 后端时,Celery 无法报告失败,因此在外部看来,这些任务似乎从未执行过,但我不明白为什么后续任务会失败。 Celery 文档说它不会在任务之间保持数据库连接,因此新任务应该建立新连接。

那么,为什么会发生这种情况?数据库连接是否存在一些较低级别的持久性?如何让 celery 重试这些任务?

【问题讨论】:

  • 不确定它是否完全相关,但我之前在 Django 中遇到过这个错误:code.djangoproject.com/ticket/15802
  • 似乎相关,但在我的情况下,我希望 celery 明确关闭连接并且下一个任务正常运行,但那没有发生。

标签: django postgresql django-celery


【解决方案1】:

我通过在我的所有 celery 任务中添加一个 after_return 处理程序来解决这个问题,以在每次执行后关闭数据库连接。

http://docs.celeryproject.org/en/latest/userguide/tasks.html#abstract-classes

class DBTask(celery.Task):
    abstract = True

    def after_return(self, *args, **kwargs):
        connection.close()

@celery.task(base=DBTask)
def mytask():
    # Do Stuff with DB

【讨论】:

    猜你喜欢
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    相关资源
    最近更新 更多