这是一个批量接口,目的是接口接收数据,数据交给协程存入 Kafka ,接口立即响应成功,越快越好,请求频率每秒 70 次,一次请求数组携带 1000 条数据。
压测的时候发现这个接口使用协程会导致服务内存暴涨,昨天查了一下午也没有头绪,即使什么也不做,只打印个数组元素的长度,发现如果不使用协程直接 for 循环处理 requestData 数据,内存就不会上涨,但这样会影响接口的响应速度,使用协程处理的话内存会立即上涨,这是为什么呢? 如果开启协程占用了内存,可是协程只有几 KB 呀,若协程内的数据处理占用,那不用协程也占用了内存啊,我的理解用了协程处理能力应该会提高才对啊,为什么反倒下降了呢?附上 pprof 内存图
func PushBatch(c *gin.Context) {
appGin := app.Gin{C: c}
gameId := c.Query("game_id")
if gameId == "" {
// 记录错误日志···
return
}
// 读取请求体
bodyBytes, err := io.ReadAll(c.Request.Body)
if err != nil {
// 记录错误日志···
return
}
// JSON 反序列化
var requestData []map[string]interface{}
if err := json.Unmarshal(bodyBytes, &requestData); err != nil {
// 记录错误日志···
return
}
// 1.没有使用协程
for _, entry := range requestData {
fmt.Println(len(entry))
// Todo 数据写入 Kafaka
}
// 2.数据放入协程
//go func(requestData []map[string]interface{}) {
//
// for _, entry := range requestData {
// //handleEntry(gameId, entry)
// fmt.Println(len(entry))
// }
//}(requestData)
// 返回状态 200
appGin.Response( http.StatusOK, e.SUCCESS, nil)
}