如何编写长时间运行的请求?

时间:2015-03-02 14:32:14

标签: database postgresql go benchmarking

到目前为止的故事。我们正在考虑转离perl。候选人是去或节点。为此我们在Dancer2,Flask,Node和Go中编写了一个简单的包装器,用于我们拥有的长时间运行的数据库查询。我把它们全部启动并运行,所以我用轻载进行基准测试。然后我决定强调应用程序。每个框架都能够应对

ab -n 1000 -c 100 http://localhost:8080/

除了去。如果我没有限制连接,那么我会收到错误'连接太多,如果我将连接限制为100,那么ab会给出超时错误并退出。

我的要点https://gist.github.com/2d8473ce576cab5f7c66带有代码。我该怎么改变,所以我可以在负载下使用go服务器?

1 个答案:

答案 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{}{}
}()