请教各位 Golang 大神一段代码

查看 16|回复 0
作者:fruitmonster   
背景:
这是一个批量接口,目的是接口接收数据,数据交给协程存入 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)
}
您需要登录后才可以回帖 登录 | 立即注册

返回顶部