1

我有一个监控脚本每分钟检查一次我们的 mongodb 实例,并且需要一种很好的连接方式,执行一个简单的查询并让它在 10 秒内返回,或者如果需要超过 10 秒就以某种可预测的方式超时,并且让我抓住那个错误/异常。

根据 pymongo 的文档,您不能设置查询超时,只能设置套接字和连接超时(这似乎工作正常)。有什么解决方法吗?

程序的流程是这样的:

  1. 连接到mongodb
  2. 执行简单find()查询以检查最后更新的文档(用于统计)
  3. 关闭连接。

#1 总是可以正常工作,但整个请求在 #2 处超时,我无法在我自己设定的 10 秒限制内捕获它。

由于许多并发的 map-reduce 查询,锁定似乎发生在高峰时段。我们正在使用 mongodb 2.4.3。

4

1 回答 1

1

您可以在创建mongo_client时使用socketTimeoutMS ,也可以将其添加到您的find中。

例如,在下面的代码中,我连接到本地 mongod,然后在 $where 函数中模拟一个长时间运行的查询,其中 10 秒睡眠(不推荐)。1 秒的 socketTimeoutMS 导致调用失败并出现pymongo.errors.AutoReconnect: timed out

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
if client.test.ing.count() == 0:
  client.test.ing.insert({})
client.test.ing.find( { '$where' : 'function() { sleep(10000); return True; }' } , socketTimeoutMS=1000).count()

我希望这会有所帮助。

注1:如果集合为空,则客户端立即返回

注意2:如果你只是得到光标而不做任何事情,那么你不会得到错误

于 2013-05-30T09:47:58.053 回答