2015-03-02 89 views
6

在研究我的Python Web应用程序中的一些奇怪问题(特别是关于MongoDB连接性的问题)时,我注意到了一些on the official PyMongo documentation page。我的web应用程序使用Flask,但这不应该影响我面临的问题。为什么PyMongo会抛出AutoReconnect?

PyMongo驱动程序执行连接池,但是当连接失效并且需要重新连接时,它也会引发异常(AutoReconnect)。

它指出,(有关autoReconnect的除外):

为了自动重新连接,您必须处理这个异常,认识 对于造成它的操作不一定成功。 未来的操作将尝试打开到 数据库的新连接(并且将继续引发此异常,直到完成第一个成功连接 )。

我注意到,这实际上是不断发生的(并且它似乎不是一个错误)。在几分钟不活动之后,连接被MongoDB服务器关闭,并且需要由Web应用程序重新创建。

我不明白为什么PyMongo驱动程序在重新连接时(驱动程序的用户需要自己处理)抛出一个错误,而不是透明地进行。 (甚至可以有一个选项,用户可以设置,以便例外被抛出,但不会明智的默认是这些例外不会被抛出,并且连接被无缝重新创建?)

我从来没有遇到过使用其他数据库系统的这种行为,这就是为什么我有点困惑。

还值得一提的是,当连接到我的本地开发MongoDB服务器时,我的Web应用程序的MongoDB连接永远不会失败(我认为这与它本地连接有关,而且连接是通过UNIX套接字而不是网络套接字,但我可能是错的)。

+1

Python驱动程序开发人员在JIRA问题中对Autoreconnect进行了几次讨论。看看[PYTHON-197](https://jira.mongodb.org/browse/PYTHON-197),对于初学者来说。如果您阅读了JIRA中有关Autoreconnect的内容并且不满意,我会打开一张PYTHON票证。 – wdberkeley 2015-03-02 15:40:25

+0

感谢您指出这一点!这感觉就好像非我这样的非强大用户,不操作整个复制的mongo群集已经被排除在外。你有什么想法为什么这些连接实际超时?如果套接字关闭,它们不应该立即失败吗? – 2015-03-02 16:08:48

+1

对于没有更多信息的情况下连接失败的原因,我无话可说。 mongod日志中是否有关于连接关闭的任何内容? – wdberkeley 2015-03-02 16:13:52

回答

6

您误会了AutoReconnect。当驱动程序尝试与服务器通信(发送命令或其他操作)并发生网络故障或类似问题时,会引发此问题。异常的名称意在表明您的不需要必须创建一个MongoClient的新实例,当您的应用程序尝试下一个操作时,现有客户端将尝试自动重新连接。如果发生同样的问题,则会再次引发AutoReconnect。

我怀疑你看到套接字超时(并引发AutoReconnect)的原因是服务器和你的应用程序之间有一个负载平衡器,它在一段时间不活动之后关闭连接。例如,这显然发生在微软的Azure平台上,经过了13分钟没有任何活动的套接字。您可以通过使用PyMongo 2.8中添加的socketKeepAlive选项来解决此问题。请注意,您还必须将应用程序服务器上的存活时间间隔设置为适当的值(Linux上的默认时间为2小时)。 See here for more information.

+0

这正是问题(这是Azure特定的)。我们现在正在使用AWS,而且我还没有看到这个问题。谢谢(你的)信息! – 2015-04-06 07:04:06

相关问题