Goroutine Pool 实现高并发

本文是读完 Handling 1 Million Requests per Minute with Go 之后,根据自己的理解,对文中提到的并发模型和实现再梳理一遍。 前言 假设有一个 http server 接收 client 发来的 request,如果用下面的这样的代码,会有什么问题呢? func payloadHandler(w http.ResponseWriter, r *http.Request) { // Go through each payload and queue items individually to be posted to S3 for _, payload := range content.Payloads { go payload.UploadToS3() // <----- DON'T DO THIS } } 显而易见,有 2 个问题: 接收一个 request 就开启一个 goroutine 处理,当 request 数量在短时间内暴增的话,光是 goroutine 的数量都足以让 server 崩溃。 每个 goroutine 都会与后端建立 TCP 连接,既耗费三次握手的时间,也会造成后端有大量 TCP 连接 所以,我们的目标是 没有蛀牙 可以控制 goroutine 的总数,方法是事先创建好一定数量的 goroutine,加入到一个 Pool 中 goroutine 启动时与后端建立 TCP 长连接,之后的通信都基于这个连接 根据原文作者给出的方法,整体的架构如下: ...

2020-10-13 · Me