我为 mongodb 创建了数据库连接池:
type dbcp struct {
sync.Mutex
connections map[*mongo.Client]struct{}
}
3个主要功能dbcp
:
func newDBConnection() *mongo.Client {
// Возвращает новое соединение
}
func getDBConnection() *mongo.Client {
if len(dbcp.connections) {
// Если пул не пустой, возвращает соединение из пула
}
// Если пул пустой, возвращает новое соединение:
return newDBConnection():
}
func (c *mongo.Client) release() {
// Добавляет соединение в пул и устанавливает таймаут
// закрытия этого соединения и удаления из пула
}
每个请求有条件地/test?id=123
打开一个连接,id=123
从数据库中获取数据,使用该方法将连接发送到池c.release()
无论有多少请求同时进入 - 1000、2000 或 10000,我的计算机上池中的连接永远不会超过 6 个。我是否正确理解Go
goroutine 中处理的每个请求都会阻塞一个线程?我一直认为 goroutine 在等待 I/O 操作时会自行切换(也就是说,它们不会阻塞)。如果是这样,如何处理?如何让一台服务器同时支持大量连接?
UPD:我检查了Node.js
- 连接数仍然是 6,尽管该语言是在单线程环境中解释的。
现代浏览器限制到单个主机的连接数。在大多数情况下,这个数字是 6。在enSO的问题中,人们收集了整个集合。
如何测试?您可以尝试打开多个页面和/或浏览器。并且可以使用专门的工具,比如ab(不过最好按照ab apache这个词去google)。
您也可以编写 bash 脚本。某处如此
注意&符号 - 它迫使您不要等待任务结束,而是会启动知识渊博的任务。是的,这完全是在膝盖上,但对于简单的测试 - 你需要什么。