2

我使用 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'
)

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

If mongo primary shuts down and gets re-elected, celery workers automatically reconnect to a new configuration. 但是无论我重试多少次,无论我等待多长时间,所有后续查询都会conn返回异常。AutoReconnect

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

更新

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

4

1 回答 1

5

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

于 2013-06-19T05:40:17.603 回答