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()后手动调用AutoReconnect。MonitorThread在这种情况下似乎无法正常工作。
原因是 celery 启动它的工人的方式。默认情况下,在 3.0.15 中它使用fork()which 复制父进程的状态,但使MonitorThread死亡。解决方案是使用CELERYD_FORCE_EXECV选项强制芹菜运行工人execv()并使监视器再次活跃和快乐。
| 归档时间: |
|
| 查看次数: |
471 次 |
| 最近记录: |