我今天早些时候做了一些负载测试,发现了一些特殊的东西,有时Http请求不会死,并继续射击。如何在我的Golang代码中更正,例如见下图。我正在加载测试加载1,000个HTTP请求,但如果您在下面的第1,000个请求中注意到它需要392,999毫秒或 392秒,而其余请求平均需要 2.2秒 。我已多次完成测试,有时会挂起。这是我的代码
func Home_streams(w http.ResponseWriter, r *http.Request) {
var result string
r.ParseForm()
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
defer wg.Done()
db.QueryRow("select json_build_object('Locations', array_to_json(array_agg(t))) from (SELECT latitudes,county,longitudes,"+
"statelong,thirtylatmin,thirtylatmax,thirtylonmin,thirtylonmax,city"+
" FROM zips where city='Orlando' ORDER BY city limit 5) t").Scan(&result)
}()
wg.Wait()
fmt.Fprintf(w,result)
}
并使用此代码连接到数据库
func init() {
var err error
db, err = sql.Open("postgres","Postgres Connection String")
if err != nil {
log.Fatal("Invalid DB config:", err)
}
if err = db.Ping(); err != nil {
log.Fatal("DB unreachable:", err)
}
}
我会说大约10%的时间我加载测试这个问题发生了,它停止的唯一方法就是我手动停止请求,否则它会无限期地继续运行。我想知道这个问题是否可以在这里得到解决https://medium.com/@nate510/don-t-use-go-s-default-http-client-4804cb19f779#.83uzpsp24我仍然在学习Golang。
答案 0 :(得分:1)
并且它停止的唯一方法是如果我手动停止请求,否则 它会无限期地继续下去
您没有显示完整的代码,但似乎您正在使用http.ListenAndServe
便利功能,该功能未设置默认超时。所以我假设发生的事情是你的数据库服务器正在超载而你的http服务器没有设置为超时,所以只是等待数据库响应。
假设所有这些都是正确的,请尝试做这样的事情:
srv := &http.Server{
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
}
srv.ListenAndServe()
有一个很好的参考here。