3 回答
TA贡献1844条经验 获得超8个赞
Go 的 http 包默认不指定请求超时。您应该始终在服务中包含超时。如果客户不关闭他们的会话怎么办?您的进程将保持活跃的旧会话达到 ulimits。一个坏演员可能会故意打开数千个会话,对您的服务器进行 DOS 攻击。重负载服务也应该调整 ulimits,但会调整 backstop 的超时时间。
确保您指定超时:
http.DefaultClient.Timeout = time.Minute * 10
您可以通过监控进程打开的文件前后验证:
lsof -p [PID_ID]
TA贡献1793条经验 获得超6个赞
如果您想运行数百万个打开/读取/关闭套接字的 go 例程,那么您最好提高 ulimit,或者打开/读取/关闭套接字并将读取的值传递给 go-routine,但我会使用缓冲通道来控制您希望能够打开多少个文件描述符。
const (
// this is where you can specify how many maxFileDescriptors
// you want to allow open
maxFileDescriptors = 100
)
func main() {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, client")
}))
defer ts.Close()
var wg sync.WaitGroup
maxChan := make(chan bool, maxFileDescriptors)
for i := 0; i < 1000; i++ {
maxChan <- true
wg.Add(1)
go func(url string, i int, maxChan chan bool, wg *sync.WaitGroup) {
defer wg.Done()
defer func(maxChan chan bool) { <-maxChan }(maxChan)
resp, err := http.Get(url)
if err != nil {
panic(err)
}
greeting, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
err = resp.Body.Close()
if err != nil {
panic(err)
}
fmt.Printf("%d: %s", i, string(greeting))
}(ts.URL, i, maxChan, &wg)
}
wg.Wait()
}
- 3 回答
- 0 关注
- 192 浏览
添加回答
举报