我一直在 stackoverflow 和一些帖子中检查几个问题,其中人们公开了如何使用 mgo golang lib 管理 session 的示例。
关键是我见过的所有例子都没有同时运行太多的并发查询。增加并发操作的数量以关闭的套接字结束。在这里你可以找到我为了重现这种行为而运行的代码。
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
我该如何处理?我想保持这种并发水平,甚至在某个时候增加它。
最佳答案
如果我将插入次数增加到 5000 以上,结果与不在 docker 容器中的 Mongo 数据库相同。
没有 session 副本的插入工作正常,带有 session 副本的插入最终会出现 mongo 错误“显式关闭”。
根据 William Kennedy blog ,推荐的方法确实是制作 session 副本。否则,操作将与同一套接字中的其他 go 例程序列化。
如果您计算使用 mongoldb 打开的套接字数:
虽然是真的;做 lsof -i | grep 27017 | wc -l ; sleep 0.5 ;完毕
当我们没有 session 副本时,您会看到我们打开了一个套接字。
使用 session 复制时,套接字的数量可以提高很多。
我认为在 mongo 或系统中达到了开放套接字限制。 ulimit
可用于检查 shell 环境的限制。
请注意,根据设计,mgo 不允许对 session 数进行任何限制。这个想法是避免在 db 访问端设置限制,并插入开发人员在其代码的入口点引入限制:例如,限制同时处理的 http 请求的数量。
关于mongodb - 使用 mgo 对 MongoDB 的并发查询以关闭的套接字结束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42735535/