【发布时间】:2019-09-17 21:59:06
【问题描述】:
我正在启动一个带有 listenandserve 的 Go API 来接受 HTTP 请求。
我怎样才能实现以下目标?
- 最多允许 100 个并发 HTTP 请求
- 第 101 个请求(以及任何其他请求)应等待 10 分钟以尝试进入此“100 个同时”限制(即,希望前 100 个请求中的一些应完成)
- 如果 10 分钟过去了,并且没有打开可用的请求“槽”,则为该等待的请求返回错误
- 接下来运行的请求 101...102...x 的顺序并不重要
当前版本完全不可用:
timeout := time.After(10 * time.Minute)
tick := time.Tick(15 * time.Second)
fullcmdfirst := fmt.Sprintf("netstat -anp | grep procname | grep ESTABLISHED | grep -v grep | wc -l")
outputfirst, err1first := exec.Command("/bin/sh", "-c", fullcmdfirst).CombinedOutput()
if strconv.ParseFloat(string(outputfirst)) < 100 {
return nil
}
// Keep trying until we're timed out or lock acquired
for {
select {
// Got a timeout! fail with a timeout error
case <-timeout:
return errors.New("Error: timed out ")
// Got a tick, we should check if we can acquire
case <-tick:
fullcmd := fmt.Sprintf("netstat -anp | grep procname | grep ESTABLISHED | grep -v grep | wc -l")
output, err1 := exec.Command("/bin/sh", "-c", fullcmd).CombinedOutput()
if strconv.ParseFloat(string(outputfirst)) < 100 {
l.Printf("start req")
return nil
}
}
}
【问题讨论】:
-
你试过什么?包括您的代码。你遇到了什么问题?
-
我在 mutex/channels 上做了一些阅读,但找不到这样的东西。我目前的解决方法是 os.exec 到 netstat 并计算已建立的连接
-
这里有几个不同且独立的问题。对于您的第一个:您可以使用信号量(在 Go 中,通常只是一个阻塞/缓冲通道)。其他问题涉及更多,并且有很多不同的解决方案需要推理。到目前为止,您尝试过什么?
-
你可以将previous包装成一个中间件,就是这样。
标签: go