gpt4 book ai didi

mongodb - MongoReplicaSetClient 不会在 celery worker 中重新连接

转载 作者:可可西里 更新时间:2023-11-01 10:01:14 27 4
gpt4 key购买 nike

我使用带有 MongoDB 2.4.4 副本集的 Celery 3.0.15 作为后端(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'
)

我可以启动一些 worker 并使用这个 conn 实例从 celery 任务中的代码访问数据库。

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

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

更新

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

最佳答案

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

关于mongodb - MongoReplicaSetClient 不会在 celery worker 中重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17170981/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com