启动 celery 时,它会重试连接到我的 rabbitmq 代理,这会为其提供必要的加载时间。这很好,因为我使用的是 docker,我无法保证服务启动的顺序以及确切的服务启动时间。
然而,在尝试连接到我设置为结果后端的本地 mysql 服务器时,celery 没有使用相同的仁慈措施并立即死亡,合理地提示它无法锁定 mysqld 套接字:
OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")
我想配置celery在放弃前重试几次,可以吗?
谢谢!
最佳答案
celery 在后台使用 sqlalchemy,它不附带开箱即用的连接重试功能,但是,您可以调整连接超时,以等待 mysql 服务器更长的时间,默认情况下该值仅为 10s,较大的值有帮助.
假设您使用 pymysql/mysqldb 作为数据库驱动程序,它接受 connect_timeout
选项,要从 celery 中指定此选项,您需要设置 database_engine_options
,这将是 passed to create_engine
sqlalchemy 函数,并设置connect_args
, 它将直接从 sqlalchemy 传递到 DB 驱动程序,例如:
app.conf.database_engine_options = {'connect_args': {'connect_timeout': 600}}
另一种选择是使用自定义连接 creator
功能,由您自己管理连接创建,您可以随时重试。
关于python - 配置celery等待后端服务启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45790652/