为什么 PyMongo 抛出 AutoReconnect?
Why does PyMongo throw AutoReconnect?
在研究我的 Python 网络应用程序的一些奇怪问题(特别是关于 MongoDB 连接的问题)时,我注意到了一些事情 on the official PyMongo documentation page。我的 Web 应用程序使用 Flask,但这应该不会影响我面临的问题。
PyMongo 驱动程序执行连接池,但它也会在连接失效且需要重新连接时抛出异常 (AutoReconnect
)。
它指出(关于自动重新连接异常):
In order to auto-reconnect you must handle this exception, recognizing
that the operation which caused it has not necessarily succeeded.
Future operations will attempt to open a new connection to the
database (and will continue to raise this exception until the first
successful connection is made).
我注意到这实际上经常发生(而且似乎不是错误)。 MongoDB 服务器在几分钟不活动后关闭连接,需要由 Web 应用程序重新创建。
我不明白为什么 PyMongo 驱动程序在重新连接时抛出错误(驱动程序的用户需要自己处理),而不是透明地进行。 (用户甚至可以设置一个选项,以便抛出 AutoReconnect
异常 do,但明智的默认设置是不抛出这些异常全部,并且无缝地重新创建了连接?)
我在使用其他数据库系统时从未遇到过这种行为,这就是我有点困惑的原因。
还值得一提的是,当连接到我的本地开发 MongoDB 服务器时,我的 Web 应用程序的 MongoDB 连接从不失败(我认为这与它是本地连接这一事实有关,并且连接是通过 UNIX 套接字而不是网络套接字完成的,但我可能是错的)。
你误解了自动重新连接。当驱动程序尝试与服务器通信(发送命令或其他操作)并且发生网络故障或类似问题时会引发此事件。异常的名称旨在表明您不必 创建 MongoClient 的新实例,当您的应用程序尝试下一个操作时,现有客户端将尝试自动重新连接。如果出现同样的问题,将再次引发 AutoReconnect。
我怀疑您看到套接字超时(并引发 AutoReconnect)的原因是服务器和您的应用程序之间存在负载平衡器,该负载平衡器会在 inactivity 一段时间后关闭连接。例如,在 socket 上没有 activity 13 分钟后,这显然发生在 Microsoft 的 Azure 平台上。您可以使用 PyMongo 2.8 中添加的 socketKeepAlive 选项来解决此问题。请注意,您还必须将应用程序服务器上的 keepalive 间隔设置为适当的值(Linux 上的默认值为 2 小时)。 See here for more information.
在研究我的 Python 网络应用程序的一些奇怪问题(特别是关于 MongoDB 连接的问题)时,我注意到了一些事情 on the official PyMongo documentation page。我的 Web 应用程序使用 Flask,但这应该不会影响我面临的问题。
PyMongo 驱动程序执行连接池,但它也会在连接失效且需要重新连接时抛出异常 (AutoReconnect
)。
它指出(关于自动重新连接异常):
In order to auto-reconnect you must handle this exception, recognizing that the operation which caused it has not necessarily succeeded. Future operations will attempt to open a new connection to the database (and will continue to raise this exception until the first successful connection is made).
我注意到这实际上经常发生(而且似乎不是错误)。 MongoDB 服务器在几分钟不活动后关闭连接,需要由 Web 应用程序重新创建。
我不明白为什么 PyMongo 驱动程序在重新连接时抛出错误(驱动程序的用户需要自己处理),而不是透明地进行。 (用户甚至可以设置一个选项,以便抛出 AutoReconnect
异常 do,但明智的默认设置是不抛出这些异常全部,并且无缝地重新创建了连接?)
我在使用其他数据库系统时从未遇到过这种行为,这就是我有点困惑的原因。
还值得一提的是,当连接到我的本地开发 MongoDB 服务器时,我的 Web 应用程序的 MongoDB 连接从不失败(我认为这与它是本地连接这一事实有关,并且连接是通过 UNIX 套接字而不是网络套接字完成的,但我可能是错的)。
你误解了自动重新连接。当驱动程序尝试与服务器通信(发送命令或其他操作)并且发生网络故障或类似问题时会引发此事件。异常的名称旨在表明您不必 创建 MongoClient 的新实例,当您的应用程序尝试下一个操作时,现有客户端将尝试自动重新连接。如果出现同样的问题,将再次引发 AutoReconnect。
我怀疑您看到套接字超时(并引发 AutoReconnect)的原因是服务器和您的应用程序之间存在负载平衡器,该负载平衡器会在 inactivity 一段时间后关闭连接。例如,在 socket 上没有 activity 13 分钟后,这显然发生在 Microsoft 的 Azure 平台上。您可以使用 PyMongo 2.8 中添加的 socketKeepAlive 选项来解决此问题。请注意,您还必须将应用程序服务器上的 keepalive 间隔设置为适当的值(Linux 上的默认值为 2 小时)。 See here for more information.