到目前为止的故事。我们正在考虑转离perl。候选人是去或节点。为此我们在Dancer2,Flask,Node和Go中编写了一个简单的包装器,用于我们拥有的长时间运行的数据库查询。我把它们全部启动并运行,所以我用轻载进行基准测试。然后我决定强调应用程序。每个框架都能够应对
ab -n 1000 -c 100 http://localhost:8080/
除了去。如果我没有限制连接,那么我会收到错误'连接太多,如果我将连接限制为100,那么ab会给出超时错误并退出。
我的要点https://gist.github.com/2d8473ce576cab5f7c66带有代码。我该怎么改变,所以我可以在负载下使用go服务器?
答案 0 :(得分:2)
问题看起来是因为同时连接太多而导致数据库超载。记住Go是一种真正的并发语言。
您是否尝试将db.SetMaxOpenConns(1000)
设置为更小的数字,例如db.SetMaxOpenConns(10)
?
或者您也可以限制同时运行的goroutine的数量,如
全局声明
const maxAtOnce = 50
var limiter = make(chan struct{}, maxAtOnce)
func init() {
// Fill up with tokens
for i := 0; i < maxAtOnce; i++ {
limiter <- struct{}{}
}
}
在你的getTimeSheet
中将其置于开头
// take a token
<-limiter
// give it back on exit
defer func() {
limiter <- struct{}{}
}()