您好,我编写了这段代码来模拟异步发送电子邮件,但如果我向该服务器发送 500 个并发请求,前 100 个请求将能够将其电子邮件排入通道而不会阻塞,但后续请求将阻塞,直到出现通道中是否有可用空间。这可能会导致我的系统出现瓶颈
package main import ( "fmt" "net/http" "time" ) var count = 0; var queue chan int func sendEmail(){ for email := range queue { time.Sleep(2 * time.Second) fmt.Println(email) } } func main() { go sendEmail() queue = make(chan int, 100) defer close(queue) http.ListenAndServe(":5000", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { count++ queue <- count w.Write([]byte("email will be sent shortly")) })) }
那么我可以为通道设置的最大缓冲区大小应该是多少?但同样,如果并发请求数明显大于缓冲区大小,仍然可能导致阻塞。处理这种情况的最佳方法是什么
需要明确的是,这并不是 Go 所特有的,只要有队列,这种情况就会发生。在某个时刻,您将耗尽资源,无论是内存还是磁盘(如果队列是持久的)。
您需要决定要做什么以及如何向发送者提供反馈,这称为背压。这是一个很大的话题,例如: