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

问题描述 投票:3回答:2

我一直在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

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

mongodb sockets go concurrency mgo
2个回答
2
投票

结果与Mongo数据库相同,如果我将插入数量增加到5 000以上,则不在docker容器中。没有会话副本的插入工作正常,会话副本的插入最终会出现mongo错误“已关闭明确”。

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

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

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

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


0
投票

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

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

还有一些关于你的代码的通知:clear(masterSession)这将是第一次恐慌,因为第一次运行时没有收集和数据。请参阅您的代码行26。

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

希望能帮助到你

© www.soinside.com 2019 - 2024. All rights reserved.