【问题标题】:Number of concurrent connection per handler method in GoGo 中每个处理程序方法的并发连接数
【发布时间】:2019-09-09 19:44:54
【问题描述】:
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”有多少并发连接?

该代码的目标是创建反向代理功能。但是,我还想根据连接到的每个服务器的并发连接来添加平衡负载。

非常感谢!

【问题讨论】:

标签: http go proxy connection


【解决方案1】:

一种方法是通过显式计算并发调用的数量来近似这个数字。这可能还不够,因为它只能告诉您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 的并发调用数。如果这足够了,可能需要对其进行扩展以跟踪每个服务器/处理程序的容量。

【讨论】:

  • 1.感谢您的评论 dm30514,我有一个问题。在您的示例中,您使用了 RWMutex。我们必须使用一些互斥锁吗? 2. 对于第二个例子,你有 RLock 然后打印数字和解锁。连读count也要锁吗?
  • 也许:p。严格来说不是你的确切例子。您是否在 go HTTP 服务器的上下文中执行handleForServer2(我假设您是)?如果是这样,那么是的,需要某种同步。这是因为 go 的 http 服务器将在单独的 go 例程中(同时)调用每个处理程序。对于第二个示例,我只是想表明使用该变量也需要同步。就像你指出的那样,如果这是唯一的读者,我认为RLock 很傻,因为它永远不会有并发读取:)
  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-01-29
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
相关资源
最近更新 更多