使用mgo对MongoDB的并发查询以封闭套接字结束

时间:2017-03-11 13:04:05

标签: mongodb sockets go concurrency mgo

我一直在stackoverflow中查看几个问题+一些帖子,其中人们公开了如何使用mgo golang lib管理会话的示例。

关键是我见过的所有示例都不会同时运行太多的并发查询。增加并发操作的数量以封闭套接字结束。在这里,您可以找到我运行的代码,以便重现此行为。

Concurrent queries to MongoDB using mgo ends in closed sockets.

请注意,我只是运行200个并发查询,为每个查询打开一个新套接字。 200不是一个大数字。

我看到的错误是:

read tcp 127.0.0.1:59583->127.0.0.1:27018: read: connection reset by peer

Closed explicitly

我该如何处理?我希望保持这种并发级别,甚至在某些时候增加它。

2 个答案:

答案 0 :(得分:2)

如果我将插入数量增加到5 000以上,那么Mongo数据库的结果与docker容器中的结果相同。 没有会话副本的插入工作正常,带有会话副本的插入最终会出现mongo错误"显式关闭"。

根据William Kennedy blog,推荐的方法确实是进行会话复制。否则,操作将与同一套接字中的其他go例程序列化。

如果计算使用mongoldb打开的套接字数:     而真实;做lsof -i | grep 27017 | wc -l;睡0.5; DONE 当我们没有会话副本时,你会看到我们有一个套接字打开。 使用会话副本时,套接字的数量可以提高数量。

我认为在mongo或系统中达到了开放套接字限制。 ulimit可用于检查shell环境的限制。

请注意,根据设计,mgo不允许对会话编号进行任何限制。这个想法是避免对数据库访问端进行限制,并推动开发人员在其代码的入口点引入限制:例如,限制同时处理的http请求的数量。

答案 1 :(得分:0)

我相信您在这里遇到的错误不是因为您的代码,而是您正在运行的图像泊坞窗。

您可以看到相同的问题right here。一种解决方案是搜索另一个linux映像或尝试重新安装它。

并注意到您的代码: clear(masterSession)这将是第一次恐慌,因为第一次运行时没有收集和数据。请参阅您的代码第26行。

我已使用docker-compose在我的本地计算机上尝试过您的代码只运行mongodb图像一切正常。所以我可以假设问题出在您的docker linux映像中。

希望有所帮助