使用集群 mongo 实例时 mongodb i/o 超时

我有一个应用程序,它使用该upper.io/db包与 Mongo 数据库服务器(它是一个相当简单的包装器gopkg.in/mgo.v2)进行通信。应用程序的工作方式是在启动时在主线程中创建一个会话,然后需要向 mongo 服务器发出请求的每个单独的 goroutine 调用Clone该会话并对defer session.Close结果值执行 a 。据我所知,这都是标准操作程序。


在我们使用本地运行的 MongoDB或MongoLab 上的沙箱实例的开发环境中,此设置不会出现任何错误。最近,我们将应用程序提升到我们的暂存环境中,我们让应用程序与 MongoLab 上的 MongoDB 共享集群实例(最便宜的 15 美元选项)进行通信。这就是奇怪开始发生的地方。通过的 /first/ 请求(从第一个被调用的 go-routine 开始)返回预期的响应,但随后的请求都返回


 read tcp <ip address>:47112: i/o timeout

这发生在我们指向集群的本地开发机器或用于临时环境的 AWS 主机上。由于 Mongo 集群来自 Mongolabs,我将假设他们已经正确配置了所有内容。


TBH的代码有点无聊:它实际上只是在主函数中打开会话并维护对它的引用,然后有多个具有这种基本结构的goroutine:


   sess := session.Clone()

   defer sess.Close()


   // make requests to Mongo

在测试期间,我什至限制它一次只运行一件事(即在任何给定时间只有一个 goroutine 处于活动状态),它仍然以同样的方式失败。


有没有人遇到过这个?我需要以特定方式配置 upper.io/db 吗?也许直接使用mgo?我对此无能为力:(


慕哥6287543
浏览 502回答 1
1回答

紫衣仙女

经过漫长而艰苦的过程,我们终于在我们的程序中找到了这个问题和类似问题的来源。它最终成为 upper.io/db 库的 v1 版本中的会话泄漏。此处概述了错误和修复程序,但该库的 v1 版本此时已经过时了,以后的版本不会出现此问题。我怀疑这个答案对游戏后期的任何人都有用(特别是因为我们自己解决了这个问题,就像 .. 3 年前此时),但只是想把答案留在这里以保持完整性。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go