启动芹菜时,它会重试连接到我的 rabbitmq 代理,这给了它必要的加载时间。这很好,因为我使用的是 docker,我无法保证服务的启动顺序以及哪个服务将在何时启动。
然而,在尝试连接到我设置为结果后端的本地 mysql 服务器时,芹菜没有使用相同的怜悯措施并立即死亡,合理地抱怨它无法锁定 mysqld 套接字:
OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")
我想将芹菜配置为在放弃之前重试几次,这可能吗?
谢谢!
Celery 在幕后使用 SQLlchemy,它没有开箱即用的连接重试功能,但是,您可以调整连接超时,等待更长的 MySQL 服务器,默认情况下此值仅为 10s,较大的值有所帮助。
假设你使用 pymysql/mysqldb 作为 DB 驱动程序,它接受一个connect_timeout
选项,要从 Celery 指定此选项,你需要 setdatabase_engine_options
,这将传递给 sqlalchemy 的create_engine
函数,并设置connect_args
,它将直接从 sqlalchemy 传递给 DB 驱动程序,例如:
app.conf.database_engine_options = {'connect_args': {'connect_timeout': 600}}
另一种选择是使用自定义连接creator
功能,自行管理连接的创建,您可以根据需要重试任何时间。
您可以在 docker-compose 中尝试depends_on
选项。它定义要启动的服务的顺序。您可以在此处找到官方文档。