Количество одновременных подключений на метод обработчика в Go - PullRequest
3 голосов
/ 19 апреля 2019
func handleForServer1(res http.ResponseWriter, req *http.Request) {
    rPayload := parseRequestBody(req)
    serve("http://server1:8080", res, req)
}

func handleForServer2(res http.ResponseWriter, req *http.Request) {
    rPayload := parseRequestBody(req)
    serve("http://server2:8080", res, req)
}

func serve(dest string, res http.ResponseWriter, req *http.Request) {
    url, _ := url.Parse(dest)
    p := httputil.NewSingleHostReverseProxy(url)

    req.URL.Host = url.Host
    req.URL.Scheme = url.Scheme
    req.Header.Set("X-Forwarded-Host", req.Header.Get("Host"))
    req.Host = url.Host

    p.ServeHTTP(res, req)
}

У меня есть код, как указано выше.Мне интересно, есть ли способ узнать, сколько одновременных соединений имеет обработчик "handleForServe2"?

Целью этого кода является создание функции обратного прокси.Но я также хотел бы добавить баланс загрузки на основе одновременных подключений на сервер, к которому подключен.

Большое вам спасибо!

1 Ответ

3 голосов
/ 19 апреля 2019

Одним из способов может быть приближение этого числа путем явного подсчета количества одновременных вызовов. Этого может быть недостаточно, поскольку он может только сказать вам, сколько раз вызывается handleForServe2. Для иллюстрации:

mu sync.RWMutex
concurrentInvocations := 0

func handleForServer2(res http.ResponseWriter, req *http.Request) {
    mu.Lock()
    concurrentInvocations++
    mu.Unlock()

    defer func() {
       mu.Lock()
       concurrentInvocations--
       mu.Unlock()
    }()

    rPayload := parseRequestBody(req)
    serve("http://server2:8080", res, req)
}
ticker := time.NewTicker(5 * time.Second)
for {
   select {
     case <- ticker.C:
       mu.RLock()
       fmt.Printf("Current %d concurrent requests\n", concurrentInvocations)
       mu.RUnlock()
   }
}

Теперь в любое время вы сможете увидеть количество одновременных вызовов handleForServer2. Если этого достаточно, вероятно, его необходимо расширить, чтобы отслеживать емкость каждого сервера / обработчика.

...