v0.1.35: серверные таймауты по Соннету — ReadHeaderTimeout вместо ReadTimeout, MaxHeaderBytes
This commit is contained in:
+14
-6
@@ -140,13 +140,21 @@ func main() {
|
|||||||
// Metrics: gauge updater — пересчёт очередей/сообщений per tenant каждые 15 секунд
|
// Metrics: gauge updater — пересчёт очередей/сообщений per tenant каждые 15 секунд
|
||||||
metrics.StartGaugeUpdater(15*time.Second, quit)
|
metrics.StartGaugeUpdater(15*time.Second, quit)
|
||||||
|
|
||||||
// HTTP сервер с таймаутами
|
// HTTP сервер с таймаутами (рекомендации ревью Соннета, план v0.1.35):
|
||||||
|
// - ReadHeaderTimeout 10с — лимит ТОЛЬКО на чтение заголовков (slowloris).
|
||||||
|
// ReadTimeout НЕ ставим: он обрывал бы запросы с медленной/большой
|
||||||
|
// загрузкой тела (в т.ч. большие SendMessage) и ломал бы long-poll.
|
||||||
|
// - WriteTimeout 35с — ответ; чуть больше max WaitTimeSeconds (20с long-poll).
|
||||||
|
// - IdleTimeout 90с — keep-alive; больше интервала ретраев клиентских SDK.
|
||||||
|
// - MaxHeaderBytes 8192 — защита от гигантских заголовков
|
||||||
|
// (платформа режет >16KB, наш лимит строже).
|
||||||
srv := &http.Server{
|
srv := &http.Server{
|
||||||
Addr: "0.0.0.0:" + port,
|
Addr: "0.0.0.0:" + port,
|
||||||
Handler: r,
|
Handler: r,
|
||||||
ReadTimeout: 30 * time.Second,
|
ReadHeaderTimeout: 10 * time.Second,
|
||||||
WriteTimeout: 35 * time.Second, // чуть больше чем max WaitTimeSeconds (20s)
|
WriteTimeout: 35 * time.Second,
|
||||||
IdleTimeout: 60 * time.Second,
|
IdleTimeout: 90 * time.Second,
|
||||||
|
MaxHeaderBytes: 8192,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Запуск в горутине для graceful shutdown
|
// Запуск в горутине для graceful shutdown
|
||||||
|
|||||||
Reference in New Issue
Block a user