【问题标题】:Mgo-based app code structure dealing with connection pool and tcp timeouts基于 Mgo 的应用程序代码结构处理连接池和 tcp 超时
【发布时间】:2013-11-20 10:33:14
【问题描述】:

我很好奇我应该如何使用 Mgo 库以 Go 语言构建 JSON REST API 服务器。我有几十个相互关联的集合。我用我当前的方法创建了the gist,其中包含文件结构的示例部分。

效果很好,但有时我会遇到由以下错误导致的停机:“read tcp 10.168.30.100:37288: i/o timeout”。我想我不恰当地处理了mgo连接池。有没有例子说明我应该如何基于 mgo 创建大型应用程序?

【问题讨论】:

  • 您是否在 MongoDB 中创建过任何大型应用程序?我的意思是可能是问题,因为你的数据模型不是那么好,那么加载你需要的所有数据所花费的时间(只是客人:D)
  • 在大多数情况下它都非常快。服务器重启后这个问题就消失了。
  • 您是否尝试为每个请求创建与 mongodb 的新连接(我的意思是 http 处理程序中的 cal mgo.Dial)。也许分析你的程序会对你有所帮助。
  • 我有一个 node.js 应用程序正在生产中,有超过 100.000 个用户,但它也遇到超时问题,所以也许解决方案可能更通用。该服务器大部分时间在 20-200 毫秒内按请求工作。

标签: tcp go mgo


【解决方案1】:

此错误消息表明往返数据库的时间超过了您定义的超时时间。假设您没有任何导致应用程序运行缓慢的实际问题,只需增加该超时即可解决问题。

一般来说,这个错误并不意味着您有任何规模问题,除了您可能在某些集合中拥有越来越多的数据并且某些查询可能变得太慢并且需要重新考虑(索引等)。

也无需重新启动应用程序。您可以刷新有问题的会话,或者关闭并重新创建会话,以防您使用主会话的副本。 mgo 和连接池的状态仍然很好。它只是警告您此特定会话在线路上发现了一个问题,因此您必须在会话再次有效之前确认它。

像往常一样,还要确保使用最新版本以避免已经修复的问题(如果有的话)。

【讨论】:

  • 我在应用程序启动时创建一次会话并在每个 http 处理程序中使用它,如我的要点 - gist.github.com/rafalsobota/7369852#file-database-go-L13 。可能会导致这个问题吗?如果是这样,我可以在解析 http 请求后简单地刷新会话,还是应该为每个 http 请求克隆会话并将其传递给我的模型逻辑(它需要对我的代码进行重大重构)?
  • 当我的应用程序中出现此错误时,它会重复多次,并且在服务器重新启动后一切都恢复正常。
  • 您准确地描述了我在第三段中指出的行为。在您承认错误之前,错误不会消失。组织它的一种简单而好的方法是复制每个处理程序的主会话,并延迟关闭它以确保您没有泄漏。这样每个新会话都会从池中选择一个好的套接字,或者在必要时建立一个新的连接。
  • 感谢古斯塔沃。是否有任何博客文章此连接池如何在封面下工作?我不认为我了解所有内容,但仍有一些问题。 1.这个错误是否意味着连接丢失并且mgo还不知道并重用它? 2. 当我关闭连接时,如果它坏了,它不会回到池中吗? 3. 出现错误时立即刷新会话并重试而不是返回 5xx http 状态码是一种好习惯吗?
  • 4.我可以在多个 goroutine 中的整个应用程序中仅使用一个会话,并且仅在检测到此错误时刷新此全局会话吗?为什么不?我现有的查询会被杀死吗?
猜你喜欢
  • 2012-05-11
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 2013-12-27
  • 2014-06-07
相关资源
最近更新 更多