我使用 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
无法正常工作。