我一直在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
我该如何处理?我希望保持这种并发级别,甚至在某些时候增加它。
答案 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映像中。
希望有所帮助