当启动芹菜时,它重试连接到我的rabbitmq代理,这使它有必要的加载时间.这很好,因为我使用的是docker,我无法保证服务启动的顺序以及确切的服务时间.
然而,在尝试连接到我设置为结果后端的本地mysql服务器时,芹菜不使用相同的怜悯度量并立即死亡,合理地抱怨它无法锁定mysqld套接字:
OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")
Run Code Online (Sandbox Code Playgroud)
我想在放弃之前配置芹菜重试几次,这可能吗?
谢谢!
celery 在后台使用 sqlalchemy,它不具备开箱即用的连接重试功能,但是,您可以调整连接超时,以等待 mysql 服务器更长的时间,默认情况下该值只有 10 秒,较大的值会有所帮助。
假设您使用 pymysql/mysqldb 作为数据库驱动程序,它接受一个connect_timeout选项,要从 celery 指定此选项,您需要 set database_engine_options,它将传递给sqlalchemy 的函数create_engine,并且 set connect_args,它将直接从 sqlalchemy 传递给数据库驱动程序,例如:
app.conf.database_engine_options = {'connect_args': {'connect_timeout': 600}}
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用自定义连接creator功能,自己管理连接创建,您可以随时重试。