3 回答

TA貢獻1844條經(jīng)驗 獲得超8個贊
Go 的 http 包默認(rèn)不指定請求超時。您應(yīng)該始終在服務(wù)中包含超時。如果客戶不關(guān)閉他們的會話怎么辦?您的進程將保持活躍的舊會話達(dá)到 ulimits。一個壞演員可能會故意打開數(shù)千個會話,對您的服務(wù)器進行 DOS 攻擊。重負(fù)載服務(wù)也應(yīng)該調(diào)整 ulimits,但會調(diào)整 backstop 的超時時間。
確保您指定超時:
http.DefaultClient.Timeout = time.Minute * 10
您可以通過監(jiān)控進程打開的文件前后驗證:
lsof -p [PID_ID]

TA貢獻1793條經(jīng)驗 獲得超6個贊
如果您想運行數(shù)百萬個打開/讀取/關(guān)閉套接字的 go 例程,那么您最好提高 ulimit,或者打開/讀取/關(guān)閉套接字并將讀取的值傳遞給 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 關(guān)注
- 232 瀏覽
添加回答
舉報