Как реализовать тайм-ауты на стороне сервера? (Запутался насчет тайм-аутов http.Server) - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь реализовать тайм-ауты на стороне сервера для моего сервиса. Если запрос занимает больше X секунд, сервер должен вернуть 503 Service Unavailable.

Я знаю, что это легко сделать, обернув все мои конечные точки в http.TimeoutHandler , но я запутался, почему это не делается автоматически полями Timeout http .Server

Вот тривиальный пример, который я использую для тестирования. Если я проверяю или POSTman этот сервер, он зависает навсегда, а не 5 секунд, которые я ожидаю.

package main

import (
    "net/http"
    "time"
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/timeouttest", func(_ http.ResponseWriter, _ *http.Request) {
        // busy infinite loop
        // for { _ = struct {}{}}

        // non-busy infinite loop
        select {}
    })
    srv := &http.Server{
        Addr:              "localhost:5000",
        Handler:           mux,
        ReadTimeout:       5 * time.Second,
        ReadHeaderTimeout: 5 * time.Second,
        WriteTimeout:      5 * time.Second,
        IdleTimeout:       90 * time.Second,
    }
    srv.ListenAndServe()
}

РЕДАКТИРОВАТЬ: забыл связать некоторые статьи Cloudflare, которые я использовал в качестве вдохновения. полное руководство по тайм-аутам http-голанга так что хотите выставить иди в инет

1 Ответ

0 голосов
/ 29 октября 2018

Ответ должен использовать http.TimeoutHandler. Я неправильно понял назначение полей http.Server Timeout.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...