MongoReplicaSetClient 不会在芹菜工人中重新连接

bee*_*vee 2 mongodb celery pymongo

我使用 Celery 3.0.15 和 MongoDB 2.4.4 副本集作为后端(pymongo 版本 2.5.1)。我还使用相同的副本集作为主应用程序数据存储:

CELERY_CONFIG = {
    'BROKER_URL': 'mongodb://localhost:27017,localhost:27018,localhost:27019/',
    'BROKER_TRANSPORT_OPTIONS': {
        'replicaSet': 'test'
    }
}

...

conn = MongoReplicaSetClient(
    'localhost:27017,localhost:27018,localhost:27019', 
    replicaSet='test'
)
Run Code Online (Sandbox Code Playgroud)

我可以启动一些工作程序并使用此conn实例从 celery 任务中的代码访问数据库。

如果Mongo Primary关闭并重新选举,Celery Worker会自动重新连接到新配置。但是,无论我进行了多少次重试以及等待多长时间,所有后续查询都会conn返回AutoReconnect异常。

分离代理和主数据库的副本集并不能解决问题:worker 仍然正常重新连接,但我无法从使用相同 MongoReplicaSetClient 的任务访问 mongo。

更新

解决问题conn.refresh()后手动调用AutoReconnectMonitorThread在这种情况下似乎无法正常工作。

bee*_*vee 5

原因是 celery 启动它的工人的方式。默认情况下,在 3.0.15 中它使用fork()which 复制父进程的状态,但使MonitorThread死亡。解决方案是使用CELERYD_FORCE_EXECV选项强制芹菜运行工人execv()并使监视器再次活跃和快乐。