Reputation: 733
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)
}
I have a code like above. I'm wondering if there's a way to find out how many concurrent connections does handler "handleForServe2" has?
Goal for that code is making a reverse proxy function. But, also I'd like to add balance loading based on concurrent connections per server that is connected to.
Thank you so much!
Upvotes: 3
Views: 276
Reputation: 55962
One way could be to approximate this number by explicitly counting the number of concurrent invocations. This may not be sufficient, as it can only tell you how many times handleForServe2
is being invoked. To illustrate:
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()
}
}
Now at anytime, you should be able to see the number of concurrent invocations of handleForServer2
. If this is sufficient, it probably needs to be extended to keep track of each server/handler's capacity.
Upvotes: 3